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二逼平衡树的更多相关文章

  1. bzoj 3196: Tyvj 1730 二逼平衡树

    #include<cstdio> #include<ctime> #include<cstdlib> #include<iostream> #defin ...

  2. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2271  Solved: 935[Submit][Stat ...

  3. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  4. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  5. BZOJ_3196_二逼平衡树_(树套树,线段树+Treap)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3196 可以处理区间问题的平衡树. 3196: Tyvj 1730 二逼平衡树 Time Lim ...

  6. BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )

    这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...

  7. [Tyvj 1730] 二逼平衡树

    先来一发题面QwQ [TYVJ1730]二逼平衡树 Time Limit:2 s   Memory Limit:512 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...

  8. 【BZOJ3196】二逼平衡树(树状数组,线段树)

    [BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...

  9. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

随机推荐

  1. cron计划任务

    格式 crontab -e [-u 用户名] ##编辑:注意,每项工作都是一行. crontab -l [-u 用户名] ##查看 crontab -r [-u 用户名] #清除 分 时 日 月 周 ...

  2. react 使用的方法:

    react  使用方法: 第一步: 初始化react 项目 (1)安装node npm (2)npm install --global create-react-app (3)create-react ...

  3. MongoDB设计方法及技巧

    MongoDB是一种流行的数据库,可以在不受任何表格schema模式的约束下工作.数据以类似JSON的格式存储,并且可以包含不同类型的数据结构.例如,在同一集合collection 中,我们可以拥有以 ...

  4. weui上传多图片,前端压缩,base64编码

    记录一下在做一个报修功能的心路历程,需求功能很简单,一个表单提交,表单包含简单的文字字段以及图片 因为使用的是weui框架,前面的话去找weui的表单和图片上传组件,说实话,weui的组件写的还不错, ...

  5. Spring Boot Admin 2.1.4最新实战教程

    环境的搭建 首先搭建eruka的注册中心 pom.xml <?xml version="1.0" encoding="UTF-8"?> <pr ...

  6. 微信小程序 自定义省市选择器

    1.把省市数据放在city.js中,city.js放在until目录下 // city.js module.exports = { "province": [ { "ti ...

  7. 【Model Log】模型评估指标可视化,自动画Loss、Accuracy曲线图工具,无需人工参与!

    1. Model Log 介绍 Model Log 是一款基于 Python3 的轻量级机器学习(Machine Learning).深度学习(Deep Learning)模型训练评估指标可视化工具, ...

  8. ajax前后端交互原理(4)

    4.JSON 4.1 什么是JSON? JavaScript 对象表示法(JavaScript Object Notation)简称JSON,是一种轻量级的数据交换格式.虽然它基于JavaScript ...

  9. cp5200的一般步骤

    cp5200的一般步骤: 1.创建数据对象 hObj = CP5200_CommData_Create(nCommType, id, GetIDCode()); 2.生成所需要的数据,如 :生成设置亮 ...

  10. VS2017 快捷键

    VS2017注释:先CTRL+K 然后CTRL+C   (ctrl按住不松,松开k按c) 取消注释:先CTRL+K,然后CTRL+U  (ctrl按住不松,松开k按c)