传送门

暴力啊,直接树套树上啊

线段树套splay,卡卡常就直接A了

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
void read(int &x) {
char ch; bool ok;
for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
}
void print(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)print(x/10);
putchar(x%10+'0');
}
#define rg register
const int maxn=5e4+10;
int n,m,a[maxn],cnt[maxn*30],size[maxn*30],ch[maxn*30][2],rt[maxn*4],f[maxn*30],id,v[maxn*30],tot;
struct splay_tree
{
void update(int x){size[x]=size[ch[x][0]]+size[ch[x][1]]+cnt[x];}
void move(int &k,int x)
{
int tmp=ch[f[x]][1]==x,fa=f[x],faa=f[fa];
if(k==fa)k=x;
else ch[faa][ch[faa][1]==fa]=x;
ch[fa][tmp]=ch[x][tmp^1];f[ch[x][tmp^1]]=fa;
ch[x][tmp^1]=fa,f[x]=faa,f[fa]=x;
update(fa),update(x);
}
void splay(int &k,int x)
{
while(k!=x)
{
int y=f[x],z=f[y];
if(y!=k)
{
if((ch[y][0]==x)^(ch[z][0]==y))move(k,y);
else move(k,x);
}
move(k,x);
}
}
int get_pre(int k)
{
int now=ch[rt[k]][0];
while(ch[now][1])now=ch[now][1];
return now;
}
void del(int k,int x)
{
splay(rt[k],x);
if(!ch[x][0]&&!ch[x][1]){rt[k]=0;return ;}
else if(!ch[x][0]&&ch[x][1]){rt[k]=ch[x][1],f[rt[k]]=0;return ;}
else if(ch[x][0]&&!ch[x][1]){rt[k]=ch[x][0],f[rt[k]]=0;return ;}
int g=get_pre(k);splay(rt[k],g);
ch[g][1]=ch[x][1],f[ch[x][1]]=g;update(g);
}
void insert(int z,int x,int y)
{
if(!rt[z]){rt[z]=++id,v[rt[z]]=x,size[rt[z]]=cnt[rt[z]]=1;return ;}
int now=rt[z];
while(1)
{
if(x==v[now]){cnt[now]+=y,update(now);if(!cnt[now])del(z,now);else splay(rt[z],now);return ;}
else if(x<v[now])
{
if(!ch[now][0])
{
ch[now][0]=++id,size[id]=cnt[id]=1;
v[id]=x,f[id]=now;
update(now);break;
}
else now=ch[now][0];
}
else
{
if(!ch[now][1])
{
ch[now][1]=++id,size[id]=cnt[id]=1;
v[id]=x,f[id]=now;
update(now);break;
}
else now=ch[now][1];
}
}
splay(rt[z],id);
}
int findmn(int k,int x)
{
if(!k||!x)return 0;
if(v[k]==x)return size[ch[k][0]];
if(v[k]>x)return findmn(ch[k][0],x);
return size[ch[k][0]]+cnt[k]+findmn(ch[k][1],x);
}
int findmx(int k,int x)
{
if(!k||!x)return 0;
if(v[k]==x)return size[ch[k][0]]+cnt[k];
if(v[k]>x)return findmx(ch[k][0],x);
return size[ch[k][0]]+cnt[k]+findmx(ch[k][1],x);
}
int find(int k,int x)
{
if(!k)return 0;
if(x<=size[ch[k][0]])return find(ch[k][0],x);
if(x>size[ch[k][0]]&&x<=size[ch[k][0]]+cnt[k])return v[k];
return find(ch[k][1],x-size[ch[k][0]]-cnt[k]);
}
int pre(int k,int x)
{
int tmp=find(rt[k],findmn(rt[k],x));
return tmp?tmp:-2147483647;
}
int nxt(int k,int x)
{
int tmp=find(rt[k],findmx(rt[k],x)+1);
return tmp?tmp:2147483647;
}
}s[maxn*4];
void change(int x,int l,int r,int a,int b,int c)
{
s[x].insert(x,b,c);
if(l==r)return ;int mid=(l+r)>>1;
if(a<=mid)change(x<<1,l,mid,a,b,c);
else change(x<<1|1,mid+1,r,a,b,c);
}
int query(int x,int l,int r,int a,int b,int c)
{
if(a<=l&&b>=r)return s[x].findmn(rt[x],c);
int mid=(l+r)>>1,ans=0;
if(a<=mid)ans+=query(x<<1,l,mid,a,b,c);
if(b>mid)ans+=query(x<<1|1,mid+1,r,a,b,c);
return ans;
}
int find_pre(int x,int l,int r,int a,int b,int c)
{
if(a<=l&&b>=r){return s[x].pre(x,c);}
int mid=(l+r)>>1,ans=-2147483647;
if(a<=mid)ans=max(ans,find_pre(x<<1,l,mid,a,b,c));
if(b>mid)ans=max(ans,find_pre(x<<1|1,mid+1,r,a,b,c));
return ans;
}
int find_nxt(int x,int l,int r,int a,int b,int c)
{
if(a<=l&&b>=r){return s[x].nxt(x,c);}
int mid=(l+r)>>1,ans=2147483647;
if(a<=mid)ans=min(ans,find_nxt(x<<1,l,mid,a,b,c));
if(b>mid)ans=min(ans,find_nxt(x<<1|1,mid+1,r,a,b,c));
return ans;
}
bool check(int x,int y,int z,int k){return query(1,1,n,y,z,x)+1<=k;}
int main()
{
read(n),read(m);
for(rg int i=1;i<=n;i++)read(a[i]),change(1,1,n,i,a[i],1);
for(rg int i=1,opt,x,y,z;i<=m;i++)
{
read(opt),read(x),read(y);
if(opt==1)read(z),print(query(1,1,n,x,y,z)+1),puts("");
if(opt==2)
{
read(z);int l=0,r=1e8;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid,x,y,z))l=mid+1;
else r=mid-1;
}
print(r);puts("");
}
if(opt==3)change(1,1,n,x,a[x],-1),a[x]=y,change(1,1,n,x,a[x],1);
if(opt==4)read(z),print(find_pre(1,1,n,x,y,z)),puts("");
if(opt==5)read(z),print(find_nxt(1,1,n,x,y,z)),puts("");
}
}

bzoj3196:Tyvj1730二逼平衡树的更多相关文章

  1. BZOJ3196 Tyvj1730 二逼平衡树 【树套树】 【线段树套treap】

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

  2. [BZOJ3196][Tyvj1730]二逼平衡树

    [BZOJ3196][Tyvj1730]二逼平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询 \(k\) 在区间内的排名 查询区间内排名为 \ ...

  3. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  4. bzoj3196 [TYVJ1730]二逼平衡树 树套树 线段树套替罪羊树

    人傻自带大常数 二分的可行性证明: 贴近他的正确答案不会被当作次优解删掉,因为,若二分在他右边发生,那么二分一定会把左边作为优解,左边同理,所以他一定是被扣掉的所以最后一个小于等于一定是正确答案 #i ...

  5. [BZOJ3196] [Tyvj1730] 二逼平衡树(线段树 套 Splay)

    传送门 至少BZOJ过了,其他的直接弃. 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的 ...

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

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

  7. [TYVJ1730]二逼平衡树

    [TYVJ1730]二逼平衡树 题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查 ...

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

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

  9. 【bzoj3196】 Tyvj1730—二逼平衡树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 (题目链接) 题意 1.查询k在区间内的排名:2.查询区间内排名为k的值:3.修改某一位值上的 ...

随机推荐

  1. Git 忽略上传文件设置 .gitignore exclude

    1.项目根目录下创建.gitignore vi .gitignore #输入需要忽略的文件,支持正则表达式, *.o *.exe*.pyc 可以用git status来检查是否生效 未添加文件前: M ...

  2. Shell中括号的作用

    Shell中括号的作用 作者:Danbo 时间:2015-8-7 单小括号() ①.命令组.括号中的命令将会断开一个子Shell顺序执行,所以括号中的变量不能被脚本余下的部分使用.括号中多个命令之间用 ...

  3. CSU - 1530 Gold Rush —— 二进制

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1530 对于一块2^n质量的gold.需要把它分成a质量和b质量(a+b=2^n),且 ...

  4. Floyd算法(弗洛伊德算法) 百度百科

    核心代码 for(int k=1; k<=NODE; ++k)//对于每一个中转点 for(int i=0; i<=NODE; ++i)//枚举源点 for(int j=0; j<= ...

  5. hdu 3932 Groundhog Build Home —— 模拟退火

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3932 找一个位置使距离最远的点的距离最小: 上模拟退火: 每次向距离最远的点移动,注意判断一下距离最远的点 ...

  6. compileSdkVersion, minSdkVersion 和 targetSdkVersion详解

    API level API level是一个整数,它指的是我们使用的框架(Framework)的版本,也就是我们使用的sdk中的各个平台下的android.jar. 但是这个API level又和An ...

  7. 生产环境下JAVA进程高CPU占用故障排查---temp

    问题描述:生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 问题分析:1,程序属于CPU密集型,和开发沟通过, ...

  8. PTA 哈希查找 除留取余法

    PTA 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单起 ...

  9. 双重检查锁实现单例(java)

    单例类在Java开发者中非常常用,但是它给初级开发者们造成了很多挑战.他们所面对的其中一个关键挑战是,怎样确保单例类的行为是单例?也就是说,无论任何原因,如何防止单例类有多个实例.在整个应用生命周期中 ...

  10. Linux 无法登陆172.***.***.***的子网

    1. sudo dhclient -r 这条命令重复执行几次 2. dhclient - 3.查看ifconfig