bzoj3196Tyvj1730二逼平衡树
题意:
维护一个数列,操作:查询k在区间内的排名、查询区间内排名为k的值3、修改某一位上的数值、查询k在区间内的前驱(前驱定义为小于x,且最大的数)、查询k在区间内的后继(后继定义为大于x,且最小的数)
题解:
线段树套treap,我写了一个星期QAQ第一、三个操作直接搞;第二个操作就二分那个值,然后查它在区间内的排名;第四、五个操作就当查询值≤(≥)当前节点就往左(右)走,用一个全局变量记往左(右)走时遍历过的最大(小)值。反思:本弱各种写挂,以前从来把treap的rotate操作写的和splay的rotate操作一样,结果这题如果还这样写,将会异常麻烦,因此不得不用引用型写法,去掉了一个fa数组,异常不习惯。同时第二个操作也很蛋疼,推了很久(实际上是抄了很久),treap也很久没写了,甚至删除节点还出现if(cnt[x]>1){cnt[x]--,sz[x]--; return;}写成if(cnt[x]>0){cnt[x]--,sz[x]--; return;}的错误,调了一整个晚修QAQ。最后交的时候10s,差点TLE。求了一下序列中的最大最小值,在第二个操作做二分时用,省了0.2s;又将线段树的l、r、lc、rc数组去掉,省了0.6s,最后结果是9.2s,还是卡时啊……
yyl大爷:你要多写些题,提高代码能力! orzzzzzzz……
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <stack>
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define maxn 2500000
#define maxm 200000
#define INF 0x3fffffff
using namespace std; int v[maxn],rnd[maxn],root[maxm],ch[maxn][],cnt[maxn],sz[maxn],nds,mx,mn,n;
stack <int> pool;
int newnode(){
if(pool.empty())return ++nds;else{int x=pool.top(); pool.pop(); return x;}
}
void delnode(int x){pool.push(x);}
void update(int x){if(! x)return; sz[x]=cnt[x]+sz[ch[x][]]+sz[ch[x][]];}
void rotate(int &x,bool lr){
if(!x)return; int a=ch[x][lr]; ch[x][lr]=ch[a][!lr]; ch[a][!lr]=x; update(x); x=a; update(a);
}
void insert(int &x,int num){
if(!x){int y=newnode(); v[y]=num; rnd[y]=rand(); ch[y][]=ch[y][]=; cnt[y]=sz[y]=; x=y; return;}
if(v[x]==num){cnt[x]++; sz[x]++; return;}
if(num<v[x])insert(ch[x][],num);else insert(ch[x][],num); update(x);
if(ch[x][]&&rnd[ch[x][]]<rnd[x])rotate(x,);
if(ch[x][]&&rnd[ch[x][]]<rnd[x])rotate(x,);
}
void del(int &x,int num){
if(!x)return;
if(v[x]==num){
if(cnt[x]>){cnt[x]--,sz[x]--; return;}
if(ch[x][]*ch[x][]==){delnode(x); x=ch[x][]+ch[x][]; return;} int y=x;
if(rnd[ch[x][]]<rnd[ch[x][]])rotate(x,),del(ch[x][],num);else rotate(x,),del(ch[x][],num);
update(x); return;
}
if(num<v[x])del(ch[x][],num);else del(ch[x][],num); update(x);
}
int rank(int x,int num){
if(!x)return ; if(v[x]==num)return sz[ch[x][]];
if(num<v[x])return rank(ch[x][],num);else return rank(ch[x][],num)+sz[ch[x][]]+cnt[x];
}
int ans;
void before(int x,int num){
if(!x)return; if(num<=v[x])before(ch[x][],num); else ans=max(ans,v[x]),before(ch[x][],num);
}
void after(int x,int num){
if(!x)return; if(num>=v[x])after(ch[x][],num); else ans=min(ans,v[x]),after(ch[x][],num);
}
void add(int x,int l,int r,int pos,int num){
insert(root[x],num); if(l==r)return; int M=(l+r)>>;
if(l<=pos&&pos<=M)add(x<<,l,M,pos,num);
if(M<pos&&pos<=r)add(x<<|,M+,r,pos,num);
}
void change(int x,int l,int r,int pos,int num,int val){
del(root[x],num); insert(root[x],val); if(l==r)return; int M=(l+r)>>;
if(l<=pos&&pos<=M)change(x<<,l,M,pos,num,val); if(M<pos&&pos<=r)change(x<<|,M+,r,pos,num,val);
}
int getrank(int k,int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return rank(root[x],k); int M=(l+r)>>,q=;
if(ql<=M)q+=getrank(k,x<<,l,M,ql,qr); if(M<qr)q+=getrank(k,x<<|,M+,r,ql,qr); return q;
}
int getindex(int k,int ql,int qr){
int L=mn,R=mx;
while(L<=R){
int M=(L+R)>>; int x=getrank(M,,,n,ql,qr);
if(x+<=k)L=M+,ans=M;else R=M-;
}
return ans;
}
void getbefore(int k,int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){before(root[x],k); return;} int M=(l+r)>>;
if(ql<=M)getbefore(k,x<<,l,M,ql,qr); if(M<qr)getbefore(k,x<<|,M+,r,ql,qr);
}
void getafter(int k,int x,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){after(root[x],k); return;} int M=(l+r)>>;
if(ql<=M)getafter(k,x<<,l,M,ql,qr); if(M<qr)getafter(k,x<<|,M+,r,ql,qr);
}
int val[maxm],m;
int main(){
scanf("%d%d",&n,&m); mx=-; mn=INF;
inc(i,,n)scanf("%d",&val[i]),mx=max(mx,val[i]),mn=min(mn,val[i]),add(,,n,i,val[i]);
inc(i,,m){
int opt,x,y,z; scanf("%d",&opt);
if(opt==)scanf("%d%d%d",&x,&y,&z),printf("%d\n",getrank(z,,,n,x,y)+);
if(opt==)scanf("%d%d%d",&x,&y,&z),printf("%d\n",getindex(z,x,y));
if(opt==)scanf("%d%d",&x,&y),change(,,n,x,val[x],y),val[x]=y,mx=max(mx,y),mn=min(mn,y);
if(opt==)scanf("%d%d%d",&x,&y,&z),ans=-,getbefore(z,,,n,x,y),printf("%d\n",ans);
if(opt==)scanf("%d%d%d",&x,&y,&z),ans=INF,getafter(z,,,n,x,y),printf("%d\n",ans);
}
return ;
}
20160508
bzoj3196Tyvj1730二逼平衡树的更多相关文章
- bzoj 3196: Tyvj 1730 二逼平衡树
#include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2271 Solved: 935[Submit][Stat ...
- 【BZOJ 3196】二逼平衡树 线段树套splay 模板题
我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...
- bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1807 Solved: 772[Submit][Stat ...
- BZOJ_3196_二逼平衡树_(树套树,线段树+Treap)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3196 可以处理区间问题的平衡树. 3196: Tyvj 1730 二逼平衡树 Time Lim ...
- BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )
这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...
- [Tyvj 1730] 二逼平衡树
先来一发题面QwQ [TYVJ1730]二逼平衡树 Time Limit:2 s Memory Limit:512 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
- 【BZOJ3196】二逼平衡树(树状数组,线段树)
[BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...
- BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树
BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...
随机推荐
- cc32a_demo-32dk2j_cpp_纯虚函数与抽象类-txwtech
//32dk2j_cpp_纯虚函数与抽象类cc32a_demo-txwtech//纯虚函数是用来继承用的//纯虚函数//抽象类-抽象数据类型//*任何包含一个或者多个纯虚函数的类都是抽象类//*不要/ ...
- cc23b_demo-函数对象c++ 调用操作符的重载与函数对象-//用模板定义一元谓词、代码示范
//用模板定义一元谓词. #include <iostream> #include <vector> #include <algorithm> using name ...
- frp多层socks代理+端口映射
一.首先在公网上配置服务端(frps.ini) [common] bind_addr = xx.xx.xx.xx #公网vps的ip bind_port = 7000 二.配置客户端frpc. i ...
- RabbitMQ巩固学习一
说起RabbitMQ大家第一时间应该想到的就是异步队列,关于异步队列的话题简直太多了,各位同学在园子里一搜便知.我第一次听异步队列这个名词感觉非常高大上
- 3.kubernetes的CNI网络插件-Flannel
目录 1.1.K8S的CNI网络插件-Flannel 1.1.1.集群规划 1.1.2.下载软件.解压.软链接 1.1.3.最终目录结构 1.1.4.拷贝证书 1.1.5.创建配置 1.1.6.创建启 ...
- Java深拷贝和浅拷贝的区别
浅拷贝 被复制的对象的所有的变量都与原对象有相同的值,而所有的引用对象仍然指向原来的对象.换言之,浅拷贝 不复制引用对象. 1 class Experience { 2 private String ...
- 【漏洞二】Apache HTTP Server "httpOnly" Cookie信息泄露漏洞
[漏洞] Apache HTTP Server "httpOnly" Cookie信息泄露漏洞 [原因] 服务器问题 Apache HTTP Server在对状态代码400的默认错 ...
- mock api测试demo
前言 本测试demo基于Spring框架测试,这几个月也是刚刚接触Spring的项目.如果不对的地方请多谅解. 正文 1.创建测试类,添加注解 @RunWith(SpringRunner.class) ...
- java基础-java与c#的可变参数
正文 可变参数,必须最为参数的最后一个参数:可变参数只能有一个: c#可变参数例子: class Program { static void Main(string[] args) { T ...
- Idea配置JRebel插件的详细配置及图解
Idea最新JRebel插件的详细配置及图解 地址:https://blog.csdn.net/nyotengu/article/details/80629631#commentBox Ⅰ安装jreb ...