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( ...
随机推荐
- nginx中的超时设置
nginx使用proxy模块时,默认的读取超时时间是60s. 1. send_timeout syntax: send_timeout the time default: send_timeout 6 ...
- PHP -- Perl风格正则表达式
1.正则表达式作为一个匹配的模版,是由原子(普通字符,例如a-z),有特殊功能的字符(元字符,例如*.+ 和?等),以及模式修正符三个部分组成.2.在于Perl兼容的正则表达式函数中使用模式时一定要给 ...
- 【Unity3D】AR应用中,关于东南西北方位的判断。
这篇文章的应用场景是这样子的: 首先我们要做的是一个带有LBS定位服务(比如高德地图.百度地图等)AR功能,在这个场景中,会有一些地图上的”点“(如派出所.学校)是我们需要显示在我们的AR镜头上的,如 ...
- linux中给PHP安装mongodb的扩展
centos5.6 32bit php 5.2.17 php安装路径 /usr/local/php phpize路径 /usr/bin php-config路径 /usr/bin php.ini路径 ...
- curl实现发送Get和Post请求(PHP)
1.CURL介绍 CURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 CURL 库.本文将介绍 CURL 的一些高级特性 ...
- 调试使用windows堆程序遇到的问题
今天测试我的api hook demo,中间有个单向链表,我对他进行遍历的时候,通过判断链表当前元素是否为NULL(即0)来进行循环控制,在cmd下正常运行,输出的是:,struct addr is ...
- centos7 没有iptables服务 file or directory? 用secureCRT登录centos?
cenetos7 采用systemd来管理服务 centos7 没有采用传统的iptables服务, 而是采用的firewalld 服务, 以及firewall-cmd 命令; 也可以采用传统的 ip ...
- 浅谈 jQuery 事件源码定位问题
该方法已过期,chrome 48还是49开始,自带各种流行框架的事件绑定解析. 勾上这个选项即可. 昨天群里有人问了个事件源码定位的问题,简单描述下是这样的. 在一个不是自己写的页面上,如何快速定位到 ...
- linux 根据文件大小查找文件
inux下的find命令用来查找文件,通过man find就知道它是无所不能的.所以按照文件大小来查找文件就不在话下.从man find搜索size,可以看到如下信息: -size n[cwbkMG] ...
- 1.0、Struts2的简单搭建方法
一.Struts2:是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet:用于jsp页面与Java代码之间的交互. 1.核心:Filter拦截器,对所有的请求进行拦截. 2.工作 ...