1. 程式人生 > >[bzoj1901]Zju2112 Dynamic Rankings

[bzoj1901]Zju2112 Dynamic Rankings

using 查詢 scan 需要 read getch 數組 樹狀數組 +=

給定數組,單點修改,區間查詢k小。$(n \leq 10000)$

暴力題?挺暴力的。樹狀數組+動態開點線段樹。

樹狀數組維護每個權值的前綴和。可以視為是樹狀數組的每個節點開一個主席樹吧。

修改:修改樹狀數組上包含修改點的權值線段樹。$O(\log^2n)$

查詢:像主席樹一樣不斷通過二分縮小區間,區間和變成用樹狀數組求。由於每次二分要查詢的節點是一樣的,需要維護這些節點的pointer跳到哪裏。$O(\log^2n)$話說我沒維護這個是$O(\log^3n)$的。。。

但是這種題n都10000了隨便怎麽做了吧,,,暴力貌似可過,,,尬

#include<bits/stdc++.h>
using namespace
std; const int N=20010; inline int read(){ int r=0,c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c)) r=r*10+c-0,c=getchar(); return r; } struct Node{ int ls,rs,sum; }T[N*100]; struct ask{ int opt,l,r,k; }q[N]; int rt[N],n,m,cnt; int a[N],b[N],tot,v; void upd(int &k,int
l,int r,int val){ if(!k)k=++cnt; T[k].sum+=v; if(l==r){ return; } int mid=l+r>>1; if(val<=mid)upd(T[k].ls,l,mid,val); else upd(T[k].rs,mid+1,r,val); } void modify(int x,int w){ w=lower_bound(b+1,b+tot+1,w)-b; for(int i=x;i<=n;i+=i&-i) upd(rt[i],
1,tot,w); } int pt[N],L,R; int sum(int x,int l,int r){ if(!x)return 0; if(L<=l&&r<=R){ return T[x].sum; } int mid=l+r>>1,ans=0; if(L<=mid)ans+=sum(T[x].ls,l,mid); if(R>mid) ans+=sum(T[x].rs,mid+1,r); return ans; } int query(int l,int r){ int ret=0; for(int i=r;i;i-=i&-i) ret+=sum(rt[i],1,tot); for(int i=l;i;i-=i&-i) ret-=sum(rt[i],1,tot); return ret; } void init(){ n=read(),m=read(); for(int i=1;i<=n;i++) a[i]=read(),b[++tot]=a[i]; char s[5]; for(int i=1;i<=m;i++){ scanf("%s",s); if(s[0]==C){ int x=read(),w=read(); q[i]=(ask){0,x,x,w}; b[++tot]=w; } else{ int l=read(),r=read(),w=read(); q[i]=(ask){1,l,r,w}; b[++tot]=w; } } sort(b+1,b+tot+1); tot=unique(b+1,b+tot+1)-b-1; } void solve(){ for(int i=1;i<=n;i++) v=1,modify(i,a[i]); for(int i=1;i<=m;i++){ if(!q[i].opt){ int x=q[i].l; v=-1;modify(x,a[x]); v=1;modify(x,a[x]=q[i].k); } else{ int x=q[i].l-1,y=q[i].r,rk=q[i].k; int l=1,r=tot; while(l^r){ int mid=l+r>>1; L=l,R=mid; int t=query(x,y); if(rk<=t)r=mid; else l=mid+1,rk-=t; } printf("%d\n",b[l]); } } } int main(){ init(); solve(); }

[bzoj1901]Zju2112 Dynamic Rankings