BZOJ1901:Zju2112 Dynamic Rankings——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1901
Description
Input
Output
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。
Sample Input
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
Sample Output
3
6
————————————————————————————
UPT:18.4.2美化代码,删改题解。
带修改主席树板子题目(bzoj真喜欢权限板子题)
然后我学了一上午:https://www.cnblogs.com/candy99/p/6166467.html
总的来说如果我们暴力修改主席树的话,我们对于每一棵主席树都需要进行修改,那么这样时间复杂度就爆棚了。
而我们考虑,树状数组和线段树的修改仅仅只是logn的。
所以我们试着让树状数组套上主席树,这样就能方便的修改值了。
也就是说,树状数组的每一个节点都挂着一棵主席树,这样所需要修改的主席树就变成O(logn)棵了。
那么查询也很简单,就是树状数组的查询方法(因为我们外层包的是树状数组,所以查询就是在查主席树的根,也就不需要主席树了)。
显然空间复杂度为O(nlognlogn)
!但是!我学的那篇博客提供了一种O(2nlogn)的做法。
我们直接将修改操作另开一棵树状数组(upt:其实是开一个主席树然后用树状数组的lowbit修改)维护,这样就变成了两个主席树了,查询的时候两者的和一加即可。
注意事项:
1.注意区分两个主席树,本代码中rt为原序列主席树,root为存修改的主席树。
2.空间记得根据空间复杂度开。
3.不要用什么玄学的stl,不然AC变TLE就是一瞬间的事情。
4.离散化。
#include<cstdio> #include<queue> #include<cctype> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const int N=20010; inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X; } struct tree{int l,r,sum; }tr[N*100]; struct question{char s[10];int i,j,k,t; }q[N]; int a[N],b[N],rt[N],root[N],n,m,Q,pool; int q1[N],t1,q2[N],t2; inline void initLSH(){sort(b+1,b+m+1);m=unique(b+1,b+m+1)-b-1;return; } inline int LSH(int v){return lower_bound(b+1,b+m+1,v)-b;} inline int lowbit(int x){return x&-x;} inline void insert(int y,int &x,int l,int r,int p,int v){tr[x=++pool]=tr[y];tr[x].sum+=v;if(l==r)return;int mid=(l+r)>>1;if(p<=mid)insert(tr[y].l,tr[x].l,l,mid,p,v);else insert(tr[y].r,tr[x].r,mid+1,r,p,v); } inline void add(int pos,int v){int p=LSH(a[pos]);for(int i=pos;i<=n;i+=lowbit(i))insert(root[i],root[i],1,m,p,v);//注意这里是root } inline int cal(){int sum1=0,sum2=0;for(int i=1;i<=t1;i++)sum1+=tr[tr[q1[i]].l].sum;for(int i=1;i<=t2;i++)sum2+=tr[tr[q2[i]].l].sum;return sum2-sum1; } inline int query(int nl,int nr,int k){int l=1,r=m;t1=t2=0;for(int i=nl;i;i-=lowbit(i))q1[++t1]=root[i];for(int i=nr;i;i-=lowbit(i))q2[++t2]=root[i];//注意这里是rootnl=rt[nl],nr=rt[nr];//注意这里是rtwhile(l<r){int ls=cal()+tr[tr[nr].l].sum-tr[tr[nl].l].sum;int mid=(l+r)>>1;if(k<=ls){for(int i=1;i<=t1;i++)q1[i]=tr[q1[i]].l;for(int i=1;i<=t2;i++)q2[i]=tr[q2[i]].l;nl=tr[nl].l;nr=tr[nr].l;r=mid;}else{for(int i=1;i<=t1;i++)q1[i]=tr[q1[i]].r;for(int i=1;i<=t2;i++)q2[i]=tr[q2[i]].r;nl=tr[nl].r;nr=tr[nr].r;l=mid+1;k-=ls;}}return l; } int main(){n=read();Q=read();for(int i=1;i<=n;i++)a[i]=b[++m]=read();for(int i=1;i<=Q;i++){scanf("%s",q[i].s);if(q[i].s[0]=='Q'){q[i].i=read();q[i].j=read();q[i].k=read();}else{q[i].i=read();q[i].t=b[++m]=read();}}initLSH();for(int i=1;i<=n;i++)insert(rt[i-1],rt[i],1,m,LSH(a[i]),1);//注意这里是rtfor(int i=1;i<=Q;i++){if(q[i].s[0]=='Q')printf("%d\n",b[query(q[i].i-1,q[i].j,q[i].k)]);else{add(q[i].i,-1);a[q[i].i]=q[i].t;add(q[i].i,1);}}return 0; }
转载于:https://www.cnblogs.com/luyouqi233/p/8157534.html
BZOJ1901:Zju2112 Dynamic Rankings——题解相关推荐
- BZOJ1901: Zju2112 Dynamic Rankings
题解:很显然的树套树 主席树+树状数组 动态维护区间权值 然后类似于查询区间第K大 复杂度nlog^2n 空间也如此 #include <bits/stdc++.h> const int ...
- BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...
- BZOJ1901 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- ...
- 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings
n<=10000的序列做m<=10000个操作:单点修改,查区间第k小. 所谓的主席树也就是一个值域线段树嘛..不过在这里还是%%fotile 需要做一个区间查询,由于查第k小,需要一些能 ...
- Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6321 Solved: 2628 [ ...
- Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)
Zju2112 Dynamic Rankings description solution code description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须 ...
- 【BZOJ1901】Dynamic Rankings,树状数组套主席树
Time:2016.05.09 Author:xiaoyimi 转载注明出处谢谢 传送门(权限) 题面 1901: Zju2112 Dynamic Rankings Time Limit: 10 Se ...
- bzoj 1901: Zju2112 Dynamic Rankings(离线树状数组+主席树)
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 8144 Solved: 3378 [ ...
- 【BZOJ1901】Zju2112 Dynamic Rankings
Description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是 ...
最新文章
- 后视镜什么时候看?老司机也不一定知道
- 汇编: 使用[bx]代替[0]获取内存数据
- is 和 == 区别 编码和解码
- Teamprise Readies Java SDK for TFS
- java struts1_struts1.x
- MFC工作笔记0007---消息映射处理
- webstore忽略指定的文件夹显示
- WINDOWS SERVER 2003 R2 AD域控安装过程实践
- 浏览器的同源策略与跨域问题的解决方案
- matlab求零空间,【线性代数】矩阵的零空间
- 怎么把苹果手机通讯录导入华为手机_苹果手机资料快速导入华为手机。苹果的ios系统也可以把资料导入安卓!...
- String、StringBuilder、StringBuffer
- 用友NC的一些漏洞复现
- 工业机器人的算法概述
- 总结2020:5个月出版两本书,日更公众号是一种怎样的体验?
- Unity 2D Animation(2D动画)学习
- ArcGIS Pro 创建tpk
- hihoCoder1378 (最大流最小割)
- python红楼梦人物统计_基于共现使用Python来分析《红楼梦》中贾宝玉与金陵十二钗的关系...
- potplayer播放器实现人声增强
热门文章
- [HTTP] Nginx代理以及面向未来的HTTP
- CSS3 浮动与定位
- Express-静态资源-路由-ajax-session
- 「ECharts」交互 API (echarts、echartsInstance)
- Node.js「四」—— 路由 / EJS 模板引擎 / GET 和 POST
- jQuery(一)—— jQuery 概述 / jQuery 选择器 / jQuery 样式操作 / jQuery 效果
- 引用参数与引用返回值
- OpenCV3学习(9.2)连通域分析函数详解connectedComponents()和connectedComponentsWithStats()
- c语言让系统蓝屏,0x000000116,教您解决电脑蓝屏代码0x000000116
- 7-4 求下一天 (30 分)