BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
【题目分析】
听说是树套树。(雾)
怒写树状数组套主席树,然后就Rank1了。23333
单点修改,区间查询+k大数查询=树状数组套主席树。
【代码】
#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 50005 #define mlog 20 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 n,m; int rt[maxn<<1],a[maxn],b[maxn<<1],cnt=0,tot=0,sum,rnk,TMP; int ls[maxn<<6],rs[maxn<<6],siz[maxn<<6]; int L[maxn],R[maxn],opt[maxn],x[maxn],y[maxn],z[maxn]; 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 ; } void ready(int l,int r) { // cout<<"ready for "<<l<<" "<<r<<endl; l--; L[0]=R[0]=0; for (int j=l;j;j-=j&(-j)) L[++L[0]]=rt[j]; for (int j=r;j;j-=j&(-j)) R[++R[0]]=rt[j]; // cout<<"L "; for (int j=1;j<=L[0];++j) cout<<L[j]<<" "; cout<<endl; // cout<<"R "; for (int j=1;j<=R[0];++j) cout<<R[j]<<" "; cout<<endl; // cout<<"L "; for (int j=1;j<=L[0];++j) cout<<siz[L[j]]<<" "; cout<<endl; // cout<<"R "; for (int j=1;j<=R[0];++j) cout<<siz[R[j]]<<" "; cout<<endl; } void cholef() { // cout<<"choose left"<<endl; 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]]; } void chorig() { // cout<<"choose right"<<endl; 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]]; } int taksum() { int ret=0; for (int i=1;i<=L[0];++i) ret-=siz[ls[L[i]]]; for (int i=1;i<=R[0];++i) ret+=siz[ls[R[i]]]; return ret; } int qrnk(int l,int r,int x) { // printf("qrnk %d %d %d\n",l,r,x); if (l==r) return 1; int mid=(l+r)/2,tmp=taksum(); // cout<<"take sum "<<tmp<<endl; if (x<=mid) return cholef(),qrnk(l,mid,x); else return chorig(),tmp+qrnk(mid+1,r,x); } int qnum(int l,int r,int x) { if (l==r) return l; int mid=(l+r)/2,tmp=taksum(); if (x<=tmp) return cholef(),qnum(l,mid,x); else return chorig(),qnum(mid+1,r,x-tmp); } int main() { n=read();m=read(); for (int i=1;i<=n;++i) scanf("%d",&a[i]),b[++cnt]=a[i]; for (int i=1;i<=m;++i) { scanf("%d%d%d",&opt[i],&x[i],&y[i]); if (opt[i]!=3) scanf("%d",&z[i]); if (opt[i]==3) b[++cnt]=y[i]; if (opt[i]==4||opt[i]==5) b[++cnt]=z[i]; } sort(b+1,b+cnt+1); cnt=unique(b+1,b+cnt+1)-b-1; for (int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+cnt+1,a[i])-b; for (int i=1;i<=m;++i) { if (opt[i]==1||opt[i]==4||opt[i]==5)z[i]=lower_bound(b+1,b+cnt+1,z[i])-b; if (opt[i]==3) y[i]=lower_bound(b+1,b+cnt+1,y[i])-b; } // cout<<endl<<endl; // for (int i=1;i<=cnt;++i) cout<<i<<" ";cout<<endl; // for (int i=1;i<=cnt;++i) cout<<b[i]<<" "; cout<<endl; // for (int i=1;i<=m;++i) cout<<opt[i]<<" "<<x[i]<<" "<<y[i]<<" "<<z[i]<<endl; // cout<<endl<<endl; for (int i=1;i<=n;++i) for (int j=i;j<=n;j+=j&(-j)) ins(rt[j],rt[j],1,cnt,a[i],1); for (int i=1;i<=m;++i) { switch(opt[i]) { case 1: ready(x[i],y[i]); printf("%d\n",qrnk(1,cnt,z[i])); break; case 3: for (int j=x[i];j<=n;j+=j&(-j)) { ins(rt[j],rt[j],1,cnt,a[x[i]],-1); ins(rt[j],rt[j],1,cnt,y[i],1); } a[x[i]]=y[i]; break; case 2: ready(x[i],y[i]); printf("%d\n",b[qnum(1,cnt,z[i])]); break; case 4: ready(x[i],y[i]); rnk=qrnk(1,cnt,z[i]); // printf("rnk is %d\n",rnk); ready(x[i],y[i]); printf("%d\n",b[qnum(1,cnt,rnk-1)]); break; case 5: ready(x[i],y[i]); TMP=0; TMP-=qrnk(1,cnt,z[i]); ready(x[i],y[i]); TMP+=qrnk(1,cnt,z[i]+1); // printf("it s have %d\n",TMP); ready(x[i],y[i]); rnk=qrnk(1,cnt,z[i]); ready(x[i],y[i]); printf("%d\n",b[qnum(1,cnt,rnk+TMP)]); } } }
BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树的更多相关文章
- bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1807 Solved: 772[Submit][Stat ...
- BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )
这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...
- bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ...
- BZOJ - 3196 Tyvj 1730 二逼平衡树 (线段树套treap)
题目链接 区间线段树套treap,空间复杂度$O(nlogn)$,时间复杂度除了查询区间k大是$O(log^3n)$以外都是$O(log^2n)$的. (据说线段树套线段树.树状数组套线段树也能过?) ...
- 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...
- bzoj 3196: Tyvj 1730 二逼平衡树
#include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 http://hzwer.com/2734.html 线段树套treap,似乎splay也可以 ...
- BZOJ 3196 Tyvj 1730 二逼平衡树:线段树套splay
传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...
- bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】
四舍五入就是个暴力. 对于线段树的每个区间都开一棵按权值排序的splay 对于第二个操作,二分一下,每次查询mid的排名,复杂度 $ O(nlog(n)^{3}) $ 其余的操作都是$ O(nlog( ...
随机推荐
- 使用mosh取代ssh提高n2n网络连接稳定性
上文实现了远程n2n访问树莓派,但是ssh协议在网络状况不好的时候命令会卡住.这里发现了一个mosh协议,可以增强稳定性,使用后效果明显. 背景:使用n2n之后,在比较差的网络环境下,经常会被time ...
- 挣值管理(PV、EV、AC、SV、CV、SPI、CPI) 记忆
挣值管理法中的PV.EV.AC.SV.CV.SPI.CPI这些英文简写相信把大家都搞得晕头转向的.在挣值管理法中,需要记忆理解的有三个参数:PV.AC.EV. PV:计划值,在即定时间点前计划 ...
- 如何将EXCEL表导入ORACLE数据库中?【转】
来源:https://zhidao.baidu.com/question/383828330.html?qbl=relate_question_2&word=excel%20%B1%ED%CA ...
- yaf学习资料
yaf学习资料 文档 鸟哥的官方文档 Yaf框架结合PHPUnit的集成测试 php yaf框架扩展实践六--单元测试.计划任务.第三方库等 php yaf框架扩展实践一--配置篇 yaf实战例子 y ...
- visio二次开发初始化问题
(转发请注明来源:http://www.cnblogs.com/EminemJK/) 问题: axDrawingControl1初始化失败((System.ComponentModel.ISuppor ...
- Java虚拟机 safepoints 初探
safepoint的定义很不规范,还跟JVM的具体实现有关,我们的讨论主要针对Hotspot VM. 先看看openjdk的官方解释: http://openjdk.java.net/groups/ ...
- CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(4)构造尺寸更灵活的背景
相比传统的图片背景来说,使用CSS构造背景色不仅可以降低网络传输的开销,更由于其尺寸的可控性受到开发者的青睐. 如设计师设计了一张背景图片作为标题背景,如图5.18所示.对于用电脑浏览网页的用户来说, ...
- redis中的key设置过期时间
EXPIRE key seconds 为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除. 在 Redis 中,带有生存时间的 key 被称为『易失的 ...
- java基础知识(一)数据类型(上)
java的数据类型 由上图,java的数据类型分为基本数据类型.引用数据类型两大类. 1.基本数据类型 与c不同,java的各种数据类型占有固定长度的内存,与具体的软硬件平台无关:另外,每种数据类型都 ...
- 兼容IE8以下浏览器input表单属性placeholder不能智能提示功能
当前很多表单提示使用了表单属性placeholder,可这属性不兼容IE8以下的浏览器,我自己写了一个兼容处理js // 兼容IE8以下浏览器input不能智能提示功能 if(navigator.ap ...