BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
BZOJ_1901_Zju2112 Dynamic Rankings_树状数组+主席树
题意:
给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1
],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改
变后的a继续回答上面的问题。
分析:
区间第k小,可以用主席树维护
然而有修改,每次修改都会对后面的线段树有影响
因为一般的主席树是前缀和的思想
不妨用树状数组维护可持久化线段树
查询和修改都乘上个logn
代码:
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 | #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define N 100500 int t[N*40],ls[N*40],rs[N*40],n,m,root[N*40]; int sx[N],sy[N],v[N],maxn=1000000000,cnt,lx,ly; char ch[10]; void insert( int x, int &y, int l, int r, int val, int c){ if (!y)y=++cnt; if (l==r) { t[y] = t[x] + c; return ;} int mid=l+r>>1; if (val<=mid) rs[y]=rs[x],insert(ls[x],ls[y],l,mid,val,c); else ls[y]=ls[x],insert(rs[x],rs[y],mid+1,r,val,c); t[y] = t[ls[y]] + t[rs[y]]; } int query( int l, int r, int k){ if (l==r) return l; int sizls=0,mid=l+r>>1,i; for (i=1;i<=ly;i++) sizls += t[ls[sy[i]]]; for (i=1;i<=lx;i++) sizls -= t[ls[sx[i]]]; if (k<=sizls){ for (i=1;i<=ly;i++) sy[i]=ls[sy[i]]; for (i=1;i<=lx;i++) sx[i]=ls[sx[i]]; return query(l,mid,k); } else { for (i=1;i<=ly;i++) sy[i]=rs[sy[i]]; for (i=1;i<=lx;i++) sx[i]=rs[sx[i]]; return query(mid+1,r,k-sizls); } } int main(){ scanf ( "%d%d" ,&n,&m); int i,x,y,z,tot=n,j,k; for (i=1;i<=n;i++) { scanf ( "%d" ,&v[i]); for (j=i;j<=n;j+=j&(-j))insert(root[j],root[j],0,maxn,v[i],1); } for (i=1;i<=m;i++) { scanf ( "%s%d%d" ,ch,&x,&y); if (ch[0]== 'C' ){ for (j=x;j<=n;j+=j&(-j)) insert(root[j],root[j],0,maxn,v[x],-1); v[x]=y; for (j=x;j<=n;j+=j&(-j)) insert(root[j],root[j],0,maxn,v[x],1); } else { scanf ( "%d" ,&z); for (lx=0,j=x-1;j;j-=j&(-j)) sx[++lx] = root[j]; for (ly=0,j=y;j;j-=j&(-j)) sy[++ly] = root[j]; printf ( "%d\n" ,query(0,maxn,z)); } } } |
【推荐】国内首个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:你的「微服务管家」又秀新绝活了