zoukankan      html  css  js  c++  java
  • Codeforces 920F

    920F - SUM and REPLACE

    思路1:

    线段树(982 ms)

    每个点最多更新6次

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pb push_back
    #define ls rt<<1,l,m
    #define rs rt<<1|1,m+1,r
    #define mem(a,b) memset(a,b,sizeof(a))
    
    const int N=1e6+5;
    const int INF=0x3f3f3f3f;
    int a[N];
    int d[N];
    ll tree[N<<2];
    int mx[N<<2];
    void init(){
        for(int i=1;i<N;i++){
            for(int j=i;j<N;j+=i)d[j]++;
        }
    }
    void push_up(int rt){
        mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
        tree[rt]=tree[rt<<1]+tree[rt<<1|1];
    }
    void build(int rt,int l,int r){
        if(l==r){
            tree[rt]=mx[rt]=a[l];
            return ;
        }
        int m=(l+r)>>1;
        build(ls);
        build(rs);
        push_up(rt);
    }
    void update(int L,int R,int rt,int l,int r){
        if(mx[rt]<=2)return ;
        if(l==r){
            tree[rt]=mx[rt]=d[tree[rt]];
            return ;
        }
        int m=(l+r)>>1;
        if(L<=m)update(L,R,ls);
        if(R>m)update(L,R,rs);
        push_up(rt);
    }
    ll query(int L,int R,int rt,int l,int r){
        if(L<=l&&r<=R)return tree[rt];
        int m=(l+r)>>1;
        ll ans=0;
        if(L<=m)ans+=query(L,R,ls);
        if(R>m)ans+=query(L,R,rs);
        return ans;
    }
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n,m,t,l,r;
        init();
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>a[i];
        build(1,1,n);
        while(m--){
            cin>>t>>l>>r;
            if(t==1)update(l,r,1,1,n);
            else cout<<query(l,r,1,1,n)<<endl;
        }
        return 0;
    }

    思路2:

    分块(1326 ms)

    每个块最多更新6次

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long 
    #define pb push_back
    #define mem(a,b) memset(a,b,sizeof(a))
    
    const int N=1e6+5;
    int d[N];
    int a[N],belong[N],blo,flag[1000];
    ll sum[1000];
    void init(){
        for(int i=1;i<N;i++){
            for(int j=i;j<N;j+=i)d[j]++;
        }
    }
    void solve(int x){
        if(flag[x])return ;
        flag[x]=1;
        sum[x]=0;
        for(int i=(x-1)*blo+1;i<=x*blo;i++){
            a[i]=d[a[i]];
            sum[x]+=a[i];
            if(a[i]>2)flag[x]=0;
        } 
    } 
    void update(int l,int r){
        if(belong[l]==belong[r]){
            for(int i=l;i<=r;i++){
                sum[belong[i]]-=a[i];
                a[i]=d[a[i]];
                sum[belong[i]]+=a[i];
            }
            return ;
        } 
        for(int i=l;i<=belong[l]*blo;i++){
            sum[belong[i]]-=a[i];
            a[i]=d[a[i]];
            sum[belong[i]]+=a[i];
        }
        for(int i=belong[l]+1;i<=belong[r]-1;i++)solve(i);
        for(int i=(belong[r]-1)*blo+1;i<=r;i++){
            sum[belong[i]]-=a[i];
            a[i]=d[a[i]];
            sum[belong[i]]+=a[i];
        }
    }
    ll query(int l,int r){
        ll ans=0;
        if(belong[l]==belong[r]){
            for(int i=l;i<=r;i++)ans+=a[i];
            return ans;
        } 
        for(int i=l;i<=belong[l]*blo;i++)ans+=a[i];
        for(int i=belong[l]+1;i<=belong[r]-1;i++)ans+=sum[i];
        for(int i=(belong[r]-1)*blo+1;i<=r;i++)ans+=a[i];
        return ans;
    } 
    int main(){
        ios::sync_with_stdio(false);
        cin.tie(0);
        init();
        int n,m,t,l,r;
        cin>>n>>m;
        blo=sqrt(n);
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++){
            belong[i]=(i-1)/blo+1;
            sum[belong[i]]+=a[i];
        }
        while(m--){
            cin>>t>>l>>r;
            if(t==1)update(l,r);
            else cout<<query(l,r)<<endl;
        }
        return 0;
    } 
  • 相关阅读:
    Pandas使用详细教程(个人自我总结版)
    时间序列算法理论及python实现(2-python实现)
    时间序列算法理论及python实现(1-算法理论部分)
    卡方分布、卡方独立性检验和拟合性检验理论及其python实现
    配置环境变量时,cmd下运行java -version,报错:找不到或无法加载主类 -version
    Git 版本管理器学习笔记
    python、数据分析师、算法工程师的学习计划
    脏读、幻读、不可重复读、mvcc
    数据是如何存储在磁盘的
    Mysql之Buffer Pool详解与调优
  • 原文地址:https://www.cnblogs.com/widsom/p/8412521.html
Copyright © 2011-2022 走看看