BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap
http://www.lydsy.com/JudgeOnline/problem.php?id=3196
线段树套treap,似乎splay也可以但是抄的hzwer学长的代码。。就写了treap,算是比较需要注意细节的题。需要注意的地方都在注释里。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cctype>
using namespace std;
#define lc 2*x
#define rc 2*x+1
const int maxn=;
const int inf=;
int n,m;
int root[maxn*];
struct tre{
int v,ls,rs,w;
int rd,siz;
}t[maxn*];
struct seg{
int l,r,mid;
}e[maxn*];
int a[maxn]={},tot=,ans;
int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x*=;x+=ch-'';ch=getchar();}
return x*f;
}
inline void update(int x){t[x].siz=t[t[x].ls].siz+t[t[x].rs].siz+t[x].w;}
inline void rturn(int &x){//左儿子成为根
int y=t[x].ls;
t[x].ls=t[y].rs; t[y].rs=x;
update(x); x=y;
}
inline void lturn(int &x){//右儿子成为根
int y=t[x].rs;
t[x].rs=t[y].ls; t[y].ls=x;
update(x); x=y;
}
void insert(int &x,int v){//把一个值放进去
if(!x){x=++tot;t[x].siz=t[x].w=;t[x].v=v;t[x].rd=rand();return;}
t[x].siz++;
if(t[x].v==v)t[x].w++;
else if(v<t[x].v){ insert(t[x].ls,v);if(t[x].rd>t[t[x].ls].rd)rturn(x);}
else {insert(t[x].rs,v);if(t[x].rd>t[t[x].rs].rd)lturn(x);}
update(x);
}
void del(int &x,int v){//把一个值去掉
if(t[x].v==v){
if(t[x].w>){t[x].w--;t[x].siz--;return;}
if(t[x].ls*t[x].rs==)x=t[x].ls+t[x].rs;//使该位置成为其儿子
else if(t[t[x].ls].rd<t[t[x].rs].rd){rturn(x);del(t[x].rs,v);}
//我觉得此时delx是没有必要的可以直接delx的儿子,标注出来如果ac不了再改回去。
else {lturn(x);del(t[x].ls,v);}
}
else if(v<t[x].v)del(t[x].ls,v);
else del(t[x].rs,v);
update(x);
}
void build(int x,int l,int r){//线段树结构
for(int i=l;i<=r;i++)insert(root[x],a[i]);
e[x].l=l;e[x].r=r;
if(l==r)return;
int mid=(l+r)/;e[x].mid=mid;
build(lc,l,mid);
build(rc,mid+,r);
}
int getrank2(int x,int v){
if(!x)return ;
if(t[x].v==v)return t[t[x].ls].siz;
else if(t[x].v>v)return getrank2(t[x].ls,v);
else return t[t[x].ls].siz+t[x].w+getrank2(t[x].rs,v);
}
int getrank(int x,int l,int r,int v){//线段树结构
if(l<=e[x].l&&r>=e[x].r){
return getrank2(root[x],v);
}int pai=;
if(l<=e[x].mid)pai+=getrank(lc,l,r,v);
if(e[x].mid<r)pai+=getrank(rc,l,r,v);
return pai;
}
void getnum(int x,int y,int k){//二分
int l=,r=inf,cnt=;
while(l<=r){//注意二分答案的储存方法,如何避免取到不存在的值
int mid=(l+r)/;
int w=getrank(,x,y,mid)+;
if(w<=k){l=mid+;cnt=mid;}
else r=mid-;
}printf("%d\n",cnt);
}
void change(int x,int z,int v){//线段树结构
del(root[x],a[z]);
insert(root[x],v);
if(e[x].l==e[x].r)return;
if(z<=e[x].mid)change(lc,z,v);
else change(rc,z,v);
}
void befo(int x,int num){
if(!x)return;
if(t[x].v<num){ans=max(t[x].v,ans);befo(t[x].rs,num);}
else befo(t[x].ls,num);
}
void afte(int x,int num){
if(!x)return;
if(t[x].v>num){ans=min(t[x].v,ans);afte(t[x].ls,num);}
else afte(t[x].rs,num);
}
void fir(int x,int l,int r,int num){//线段树结构
if(l<=e[x].l&&e[x].r<=r){
befo(root[x],num);
return;
}
if(l<=e[x].mid)fir(lc,l,r,num);
if(e[x].mid<r)fir(rc,l,r,num);
}
void las(int x,int l,int r,int num){//线段树结构
if(l<=e[x].l&&e[x].r<=r){
afte(root[x],num);
return;
}
if(l<=e[x].mid)las(lc,l,r,num);
if(e[x].mid<r)las(rc,l,r,num);
}
int main(){
//freopen("wtf.in","r",stdin);
n=read();m=read();
for(int i=;i<=n;i++)a[i]=read();
build(,,n);int x,y,z,f;
for(int i=;i<=m;i++){
scanf("%d",&f);
if(f==){scanf("%d%d%d",&x,&y,&z);printf("%d\n",getrank(,x,y,z)+);}
else if(f==){scanf("%d%d%d",&x,&y,&z);getnum(x,y,z);}
else if(f==){scanf("%d%d",&x,&y);change(,x,y);a[x]=y;}//记得把数组也改了。。一直re,大概因为这样导致del出现不存在的数无限递归
else if(f==){scanf("%d%d%d",&x,&y,&z);ans=;fir(,x,y,z);printf("%d\n",ans);}
else{scanf("%d%d%d",&x,&y,&z);ans=inf;las(,x,y,z);printf("%d\n",ans);}
}
return ;
}
BZOJ 3196 Tyvj 1730 二逼平衡树 树套树 线段树 treap的更多相关文章
- 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 二逼平衡树
#include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
- BZOJ 3196 Tyvj 1730 二逼平衡树:线段树套splay
传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...
- BZOJ - 3196 Tyvj 1730 二逼平衡树 (线段树套treap)
题目链接 区间线段树套treap,空间复杂度$O(nlogn)$,时间复杂度除了查询区间k大是$O(log^3n)$以外都是$O(log^2n)$的. (据说线段树套线段树.树状数组套线段树也能过?) ...
- bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】
四舍五入就是个暴力. 对于线段树的每个区间都开一棵按权值排序的splay 对于第二个操作,二分一下,每次查询mid的排名,复杂度 $ O(nlog(n)^{3}) $ 其余的操作都是$ O(nlog( ...
- bzoj 3196/tyvj p1730 二逼平衡树
原题链接:http://www.tyvj.cn/p/1730 树套树... 如下: #include<cstdio> #include<cstdlib> #include< ...
随机推荐
- oozie与hive的简单案例
1.把oozie中自带的hive案例拷贝到 测试目录 /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/oozie-apps下 2. 编辑 job.properties # # ...
- 【leetcode 简单】第三十六题 最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. ...
- 【leetcode 简单】第三题 回文数
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析【转】
转自:http://www.cnblogs.com/lifexy/p/7089873.html 先来分析一个简单的.lds链接脚本 例1,假如现在有head.c init.c nand.c main. ...
- CentOS7 安装python库(numpy、scipy、matplotlib、scikit-learn、tensorflow)
0.1准备工作 安装好CentOS7,配置好网络,确保网络畅通. 0.2root授权 首先:当前用户为kaid # vim /etc/sudoers 在root ALL=(ALL) ALL之后添加: ...
- java并发容器
同步容器将所有对容器状态的访问都串行化,以实现线程安全性.这种方式的缺点是严重降低并发性.Java 5.0提供了多种并发容器来改进同步容器的性能.如ConcurrentHashMap代替同步且基于散列 ...
- tomcat打开gzip、配置utf-8
在部署描述文件中配置如下内容:(web.xml) 打开gzip compression="on"配置utf-8 URIEncoding="UTF-8" < ...
- C++面试总结
1.多态 C++多态分两种--静态和动态,其中静态联编支持的多态称为编译时多态,包括重载和模板:动态联编支持的多态称为运行时多态,包括 继承和虚函数实现. 多态主要是由虚函数实现的,虚函数 ...
- 【58沈剑架构系列】lvs为何不能完全替代DNS轮询
上一篇文章“一分钟了解负载均衡的一切”引起了不少同学的关注,评论中大家争论的比较多的一个技术点是接入层负载均衡技术,部分同学持这样的观点: 1)nginx前端加入lvs和keepalived可以替代“ ...
- 【PAT】1008. 数组元素循环右移问题 (20)
1008. 数组元素循环右移问题 (20) 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN- ...