[bzoj1901][Zju2112]Dynamic Rankings_主席樹
阿新 • • 發佈:2018-07-31
序列 樹狀 進制 brush clas 修改 inline string scanf
Dynamic Rankings bzoj-1901 Zju-2112
題目大意:給定一個n個數的序列,m個操作,支持:單點修改;查詢區間k小值。
註釋:$1\le n,m\le 10^4$。
想法:如果這個教樹套樹的話,我也沒辦法。
其實就是借用了樹狀數組的思想,我們在這裏叫它...閹割樹狀數組把。
具體地,主席樹每個節點維護的仍然是前綴權值線段樹。
修改的時候將修改的點二進制lowbit分解。在分解的節點的權值線段樹上直接修改。
查詢時我們將所有區間(左端點-1)都二進制lowbit分解,然後每個點的sum都在delta上修改,判斷進左子樹還是右子樹即可。
最後,附上醜陋的代碼... ...
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 100500 int sum[N<<5],ls[N<<5],rs[N<<5],n,m,root[N<<5]; int sx[N],sy[N],v[N],maxn=1e9+10,cnt,cntx,cnty; char ch[10]; inline int lowbit(int i){return i&(-i);} // int build(int l,int r) // { // int pos=++cnt,mid=(l+r)>>1; // if(l==r) return pos; // ls[pos]=build(l,mid); // rs[pos]=build(mid+1,r); // return pos; // } int update(int pre,int l,int r,int k,int val) { int pos=++cnt,mid=(l+r)>>1; sum[pos]=sum[pre]+val; ls[pos]=ls[pre]; rs[pos]=rs[pre]; if(l==r) return pos; if(k<=mid) ls[pos]=update(ls[pre],l,mid,k,val); else rs[pos]=update(rs[pre],mid+1,r,k,val); return pos; } int query(int l,int r,int k) { if(l==r) return l; int dlt=0,mid=(l+r)>>1; for(int i=1;i<=cntx;i++) dlt-=sum[ls[sx[i]]]; for(int i=1;i<=cnty;i++) dlt+=sum[ls[sy[i]]]; if(k<=dlt) { for(int i=1;i<=cntx;i++) sx[i]=ls[sx[i]]; for(int i=1;i<=cnty;i++) sy[i]=ls[sy[i]]; return query(l,mid,k); } else { for(int i=1;i<=cntx;i++) sx[i]=rs[sx[i]]; for(int i=1;i<=cnty;i++) sy[i]=rs[sy[i]]; return query(mid+1,r,k-dlt); } } int main() { int x,y,z; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&v[i]); for(int j=i;j<=(n<<1);j+=lowbit(j)) root[j]=update(root[j],0,maxn,v[i],1); } for(int i=1;i<=m;i++) { scanf("%s%d%d",ch,&x,&y); if(ch[0]==‘C‘) { for(int j=x;j<=n;j+=lowbit(j)) root[j]=update(root[j],0,maxn,v[x],-1); v[x]=y; for(int j=x;j<=n;j+=lowbit(j)) root[j]=update(root[j],0,maxn,v[x],1); } else { scanf("%d",&z); cntx=cnty=0; for(int j=x-1;j;j-=lowbit(j)) sx[++cntx]=root[j]; for(int j=y;j;j-=lowbit(j)) sy[++cnty]=root[j]; printf("%d\n",query(0,maxn,z)); } } } /* 5 3 3 2 1 4 7 Q 1 4 3 C 2 6 Q 2 5 3 */
小結:有趣...
[bzoj1901][Zju2112]Dynamic Rankings_主席樹