【题目分析】

全靠运气,卡空间。

xjb试几次就过了。

【代码】

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define maxn 200005
#define mlog 16
#define inf 0x3f3f3f3f
#define maxm 4000005
#define F(i,j,k) for (int i=j;i<=k;++i) int ch[maxm][2],fa[maxm],siz[maxm],v[maxm],num[maxm],n,m,rt[maxn*5],a[maxn];
int L,R,X,C,tot,Pre,Nxt,opt,ans,k,aim; void update(int k)
{siz[k]=siz[ch[k][0]]+siz[ch[k][1]]+num[k];} int ins(int &k,int fat)
{
if (!k){k=++tot;num[k]=siz[k]=1;v[k]=C;fa[k]=fat;ch[k][0]=ch[k][1]=0;return k;}
siz[k]++;
if (C==v[k]) {num[k]++;return k;}
else if (C<v[k]) return ins(ch[k][0],k);
else return ins(ch[k][1],k);
} void rot(int x,int &k)
{
int y=fa[x],z=fa[y],l=0,r;
if (ch[y][1]==x) l=1; r=l^1;
if (y==k) k=x;
else
{
if (ch[z][0]==y) ch[z][0]=x;
else ch[z][1]=x;
}
fa[x]=z; fa[y]=x; fa[ch[x][r]]=y;
ch[y][l]=ch[x][r]; ch[x][r]=y;
update(y); update(x); } void splay(int x,int &k)
{
while (x!=k)
{
int y=fa[x],z=fa[y];
if (y!=k)
{
if (ch[z][0]==y^ch[y][0]==x) rot(x,k);
rot(y,k);
}
rot(x,k);
}
} void add(int o,int l,int r)
{
int mid=l+r>>1;
splay(ins(rt[o],0),rt[o]);
if (l==r) return;
if (X<=mid) add(o<<1,l,mid);
else add(o<<1|1,mid+1,r);
} void qrk(int k)
{
if (!k) return;
if (v[k]<C) {ans+=siz[ch[k][0]]+num[k];return qrk(ch[k][1]);}
if (v[k]==C) {ans+=siz[ch[k][0]];return;}
return qrk(ch[k][0]);
} void queryrk(int o,int l,int r)
{
if (L<=l&&r<=R){qrk(rt[o]);return;}
int mid=l+r>>1;
if (L<=mid) queryrk(o<<1,l,mid);
if (R>mid) queryrk(o<<1|1,mid+1,r);
} void qpr(int k)
{
if (!k) return;
if (v[k]>=C) return qpr(ch[k][0]);
else{Pre=max(Pre,v[k]); return qpr(ch[k][1]);}
} void querypr(int o,int l,int r)
{
if (L<=l&&r<=R){qpr(rt[o]);return;}
int mid=l+r>>1;
if (L<=mid) querypr(o<<1,l,mid);
if (R>mid) querypr(o<<1|1,mid+1,r);
} void qnt(int k)
{
if (!k) return;
if (v[k]<=C) return qnt(ch[k][1]);
else{Nxt=min(Nxt,v[k]); return qnt(ch[k][0]);}
} void querynt(int o,int l,int r)
{
if (L<=l&&r<=R){qnt(rt[o]);return;}
int mid=l+r>>1;
if (L<=mid) querynt(o<<1,l,mid);
if (R>mid) querynt(o<<1|1,mid+1,r);
} void del(int &k)
{
if (v[k]==C)
{
if (num[k]>1)
{
num[k]--;
siz[k]--;
splay(k,rt[aim]);
return ;
}
else
{
if (ch[k][0]*ch[k][1]==0)
{
if ((!ch[k][0])&&(!ch[k][1])) {k=0;return;}
if (!ch[k][0]) fa[ch[k][1]]=fa[k];
else fa[ch[k][0]]=fa[k];
k=ch[k][0]+ch[k][1];
return ;
}
else
{
int tmp=rand()%2;
rot(ch[k][tmp],k);
del(k);
return ;
}
}
}
siz[k]--;
if (v[k]<C) del(ch[k][1]);
else del(ch[k][0]);
} void dec(int o,int l,int r)
{
int mid=(l+r)/2;aim=o;
del(rt[o]);
if (l==r) return ;
if (X<=mid) dec(o<<1,l,mid);
else dec(o<<1|1,mid+1,r);
} int main()
{
int l,r;
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
F(i,1,n)
{
scanf("%d",&a[i]);
X=i; C=a[i];
add(1,1,n);
}
F(i,1,m)
{
scanf("%d",&opt);
switch(opt)
{
case 1:
ans=0;
scanf("%d%d%d",&L,&R,&C);
queryrk(1,1,n);
printf("%d\n",ans+1);
break;
case 2:
scanf("%d%d%d",&L,&R,&k);
l=-inf; r=inf;
while (l<r)
{
int mid=(l+r)/2+1;
C=mid; ans=0;
queryrk(1,1,n);
if (ans<=k-1) l=mid;
else r=mid-1;
}
printf("%d\n",r);
break;
case 3:
scanf("%d%d",&X,&k);
C=a[X];
dec(1,1,n);
a[X]=k; C=a[X];
add(1,1,n);
break;
case 4:
Pre=-inf;
scanf("%d%d%d",&L,&R,&C);
querypr(1,1,n);
printf("%d\n",Pre);
break;
case 5:
Nxt=inf;
scanf("%d%d%d",&L,&R,&C);
querynt(1,1,n);
printf("%d\n",Nxt);
break;
}
}
}

  

BZOJ 3196 二逼平衡树 ——树套树的更多相关文章

  1. bzoj 3196二逼平衡树 线段树套平衡树

    比较裸的树套树,对于区间K值bz上有一道裸题,详见题解http://www.cnblogs.com/BLADEVIL/p/3455336.html(其实题解也不是很详细) //By BLADEVIL ...

  2. BZOJ 3196 二逼平衡树

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

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

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

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

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ...

  5. BZOJ 3196 Tyvj 1730 二逼平衡树:线段树套splay

    传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...

  6. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  7. BZOJ3196 二逼平衡树 【线段树套平衡树】

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

  8. bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】

    四舍五入就是个暴力. 对于线段树的每个区间都开一棵按权值排序的splay 对于第二个操作,二分一下,每次查询mid的排名,复杂度 $ O(nlog(n)^{3}) $ 其余的操作都是$ O(nlog( ...

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

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

随机推荐

  1. as 开启代码混淆和混淆规则

    app的builde.gradle的文件下,buildTypes节点添加release节点,minifyEnabled属性表示是否开启混淆,proguardFiles表示混淆依赖的文件,具体开启方法如 ...

  2. Java MVC 分页实例

    共4个文件 requestLogList.jsp RequestInfoController.java RequestInfoBean.java RequestInfoService.java 1.r ...

  3. NBUT 1119 Patchouli's Books (STL应用)

    题意: 输入一个序列,每个数字小于16,序列元素个数小于9. 要求将这个序列所有可能出现的顺序输出,而且要字典序. 思路: 先排序,输出该升序序列,再用next_permutation进行转变即可,它 ...

  4. java 核心技术卷一笔记 6 .2.3 接口 lambda 表达式 内部类

    6.2.3   对象克隆 Cloneable 接口,这个接口指示一个类提供了一个安全的clone方法.(稍作了解) 为一个对象引用的变量建立副本时,原变量和副本都是同一个对象的引用,任何一个变量改变都 ...

  5. apache shiro的工作流程分析

    本文基于shiro的web环境,用宏观(也就是不精确)的角度去理解shiro的工作流程,先看shiro官方的一张图. 和应用程序直接交互的对象是Subject,securitymanager为Subj ...

  6. 【动态规划】bzoj1044: [HAOI2008]木棍分割

    需要滚动优化或者short int卡空间 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍 ...

  7. (39)zabbix snmp自定义OID nginx监控实例

    为什么要自定义OID? 前面的文章已经讲过zabbix如何使用snmp监控服务器,但是他有一个很明显的局限性:只能监控定义好的OID项目 假如我们想知道nginx进程是否在运行?在没有zabbix a ...

  8. kvm网络虚拟化管理

    1. Linux Bridge网桥管理 一个网桥上添加多个虚拟机,虚拟机之间是可以相互通信的的,同时虚拟机也都可以通外网. kvm的网桥管理可以通过brctl命令 [root@localhost ~] ...

  9. java.sql.date 插入数据库没有时分秒

    java.sql.date 插入数据库没有时分秒 把java中实体类的sql.date类型改成java.sql.Timestamp类型即可 util.date 转 Timestamp: java.sq ...

  10. Python运算符总结

    一.简介 Python中运算符分为: 算术运算符:主要用于两个对象算数计算(加减乘除等运算) 比较(关系)运算符:用于两个对象比较(判断是否相等.大于等运算) 赋值运算符:用于对象的赋值,将运算符右边 ...