P2617 Dynamic Rankings(带修主席树)
生活随笔
收集整理的這篇文章主要介紹了
P2617 Dynamic Rankings(带修主席树)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
所謂帶修主席樹(shù),就是用樹(shù)狀數(shù)組的方法維護(hù)主席樹(shù)的前綴和
思路
帶修主席樹(shù)的板子
注意數(shù)據(jù)范圍顯然要離散化即可
代碼
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct Node{int sz,lson,rson; }PT[100100*400]; struct Q{char c;int l,r,x,val; }opt[100100]; const int MAXV = 1e9+10; int Nodecnt,lcnt,rcnt,root[100100],n,m,a[100100],num[200100],nx; int lroot[100100],rroot[100100]; int lowbit(int x){return x&(-x); } void update(int L,int R,int &o,int c,int x){PT[++Nodecnt]=PT[o];o=Nodecnt;PT[o].sz+=c;if(L==R)return;int mid=(L+R)>>1;if(x<=mid)update(L,mid,PT[o].lson,c,x);elseupdate(mid+1,R,PT[o].rson,c,x); } int query(int l,int r,int L,int R,int k){lcnt=0,rcnt=0;for(int i=L-1;i;i-=lowbit(i))lroot[++lcnt]=root[i];for(int i=R;i;i-=lowbit(i))rroot[++rcnt]=root[i];while(l<=r){if(l==r)return l;int lch=0,mid=(l+r)>>1;for(int i=1;i<=rcnt;i++)lch+=PT[PT[rroot[i]].lson].sz;for(int i=1;i<=lcnt;i++)lch-=PT[PT[lroot[i]].lson].sz;if(k>lch){//to rightfor(int i=1;i<=rcnt;i++)rroot[i]=PT[rroot[i]].rson;for(int i=1;i<=lcnt;i++)lroot[i]=PT[lroot[i]].rson;k-=lch;l=mid+1;}else{for(int i=1;i<=rcnt;i++)rroot[i]=PT[rroot[i]].lson;for(int i=1;i<=lcnt;i++)lroot[i]=PT[lroot[i]].lson;r=mid;}} } void set(int pos,int x,int c){//x-cwhile(pos<=n){update(1,nx,root[pos],c,x);pos+=lowbit(pos);} } int main(){scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);num[++nx]=a[i];}for(int i=1;i<=m;i++){char c=getchar();while(c!='Q'&&c!='C')c=getchar();if(c=='Q'){opt[i].c='Q';scanf("%d %d %d",&opt[i].l,&opt[i].r,&opt[i].val);}else{opt[i].c='C';scanf("%d %d",&opt[i].val,&opt[i].x);num[++nx]=opt[i].x;}}sort(num+1,num+nx+1);nx=unique(num+1,num+nx+1)-num-1;for(int i=1;i<=n;i++)a[i]=lower_bound(num+1,num+nx+1,a[i])-num;for(int i=1;i<=m;i++)if(opt[i].c=='C')opt[i].x=lower_bound(num+1,num+nx+1,opt[i].x)-num;for(int i=1;i<=n;i++)set(i,a[i],1);for(int i=1;i<=m;i++){if(opt[i].c=='Q'){printf("%d\n",num[query(1,nx,opt[i].l,opt[i].r,opt[i].val)]);}else{set(opt[i].val,a[opt[i].val],-1);set(opt[i].val,opt[i].x,1);a[opt[i].val]=opt[i].x;}}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/dreagonm/p/10105213.html
總結(jié)
以上是生活随笔為你收集整理的P2617 Dynamic Rankings(带修主席树)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端基础!!!前端三层?
- 下一篇: 年轻群体当道,哈弗F7如何赢得芳心?