Luogu - P3374 cdq分治 && 學習筆記
阿新 • • 發佈:2018-07-30
pan log fine har std tor || else code
題意: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; }
Luogu - P3374 cdq分治 && 學習筆記