Luogu - P3374 cdq分治 && 学习笔记

题意:m次操作,单点更新,区间查询

时间复杂度\(O(mlogm)\)
待我玩会游戏整理下思绪(分明是想摸鱼

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 1.5e6+11;
typedef long long ll;
const ll MOD = 1e9+7;
const ll INF = 1ll<<60;
unsigned int SEED = 19260817;
ll read(){
    ll x=0,f=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

struct QUERY{
    int pos,val,type;
    bool operator < (const QUERY &rhs) const{
        if(pos!=rhs.pos) return pos<rhs.pos;
        return type<rhs.type;
    }
}Q[MAXN],tmp[MAXN];
ll ans[MAXN];
void solve(int l,int r){
    if(l==r)return;
    int mid=l+r>>1;
    solve(l,mid);
    solve(mid+1,r);
    int p=l,q=mid+1,cnt=0;
    ll sum=0;
    while(p<=mid&&q<=r){
        if(Q[p]<Q[q]){
            if(Q[p].type==1) sum+=Q[p].val;
            tmp[++cnt]=Q[p++];
        }else{
            if(Q[q].type==2) ans[Q[q].val]-=sum;
            if(Q[q].type==3) ans[Q[q].val]+=sum;
            tmp[++cnt]=Q[q++];
        }
    }
    while(p<=mid) tmp[++cnt]=Q[p++];
    while(q<=r){
        if(Q[q].type==2) ans[Q[q].val]-=sum;
        if(Q[q].type==3) ans[Q[q].val]+=sum;
        tmp[++cnt]=Q[q++];
    }
    rep(i,1,cnt) Q[i+l-1]=tmp[i];
}
int main(){
    int m,n;
    while(cin>>n>>m){
        int cnt=0,ansid=0;
        rep(i,1,n){
            Q[++cnt].pos=i;
            Q[cnt].val=read();
            Q[cnt].type=1;
        }
        rep(i,1,m){
            int op=read();
            if(op==1){
                Q[++cnt].pos=read();
                Q[cnt].val=read();
                Q[cnt].type=1;
            }else{
                int l=read();
                int r=read();
                Q[++cnt].pos=l-1;
                Q[cnt].val=++ansid;
                Q[cnt].type=2;
                Q[++cnt].pos=r;
                Q[cnt].val=ansid;
                Q[cnt].type=3;
            }
        }
        solve(1,cnt);
        rep(i,1,ansid) println(ans[i]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/caturra/p/9387626.html
今日推荐