BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
【题目分析】
BZOJ这个题目抄的挺霸气。
主席树是第一时间想到的,但是修改又很麻烦。
看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树。
学到了新的姿势,2333o(* ̄▽ ̄*)ブ
【代码】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <set> #include <map> #include <string> #include <algorithm> #include <vector> #include <iostream> #include <queue> using namespace std; #define maxn 20005 #define mlog 16 #define inf (0x3f3f3f3f) int read() { int x=0,f=1; 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; } int rt[maxn],ls[maxn*mlog*mlog],rs[maxn*mlog*mlog],siz[maxn*mlog*mlog]; int a[maxn],b[maxn],n,m,top=0,tot=0; int opt[maxn],x[maxn],y[maxn],z[maxn],L[mlog],R[mlog]; char s[11]; void ins( int o1, int & o2, int l, int r, int x, int f) { // printf("ins %d %d %d %d %d %d\n",o1,o2,l,r,x,f); o2=++tot; siz[o2]=siz[o1]+f; if (l==r) return ; int mid=(l+r)/2; if (x<=mid) rs[o2]=rs[o1],ins(ls[o1],ls[o2],l,mid,x,f); else ls[o2]=ls[o1],ins(rs[o1],rs[o2],mid+1,r,x,f); return ; } int query( int l, int r, int x) { // printf("query %d %d %d\n",l,r,x); if (l==r) return l; int mid=(l+r)/2,tmp=0; for ( int i=1;i<=L[0];++i) tmp-=siz[ls[L[i]]]; for ( int i=1;i<=R[0];++i) tmp+=siz[ls[R[i]]]; // printf("tmp is %d\n",tmp); if (x<=tmp) { for ( int i=1;i<=L[0];++i) L[i]=ls[L[i]]; for ( int i=1;i<=R[0];++i) R[i]=ls[R[i]]; return query(l,mid,x); } else { for ( int i=1;i<=L[0];++i) L[i]=rs[L[i]]; for ( int i=1;i<=R[0];++i) R[i]=rs[R[i]]; return query(mid+1,r,x-tmp); } } int main() { top=n=read();m=read(); for ( int i=1;i<=n;++i) b[i]=a[i]=read(); for ( int i=1;i<=m;++i) { scanf ( "%s" ,s); switch (s[0]) { case 'Q' : opt[i]=0;x[i]=read();x[i]--;y[i]=read();z[i]=read(); break ; case 'C' : opt[i]=1;x[i]=read();y[i]=read();b[++top]=y[i]; break ; } } sort(b+1,b+top+1); top=unique(b+1,b+top+1)-b-1; for ( int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+top+1,a[i])-b; for ( int i=1;i<=m;++i) if (opt[i]) y[i]=lower_bound(b+1,b+top+1,y[i])-b; // printf("lisan is OK!\n"); // for (int i=1;i<=n;++i) printf("%d ",a[i]); printf("\n"); // for (int i=1;i<=m;++i) printf("%d ",y[i]); printf("\n"); for ( int i=1;i<=n;++i) { // printf("ins %d %d\n",a[i],i);getchar(); for ( int j=i;j<=n;j+=j&(-j)) ins(rt[j],rt[j],1,top,a[i],1); } for ( int i=1;i<=m;++i) { if (opt[i]) { // printf("fix %d to %d\n",x[i],y[i]); for ( int j=x[i];j<=n;j+=j&(-j)) { ins(rt[j],rt[j],1,top,a[x[i]],-1); ins(rt[j],rt[j],1,top,y[i],1); } a[x[i]]=y[i]; } else { // printf("query %d %d %d \n",x[i],y[i],z[i]); L[0]=0; R[0]=0; for ( int j=x[i];j;j-=j&(-j)) L[++L[0]]=rt[j]; for ( int j=y[i];j;j-=j&(-j)) R[++R[0]]=rt[j]; // printf("L :"); for (int j=1;j<=L[0];++j) printf("%d ",L[i]); // printf("R :"); for (int j=1;j<=R[0];++j) printf("%d ",R[i]); printf ( "%d\n" ,b[query(1,top,z[i])]); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了