BZOJ 3196 线段树套平衡树
(代码无比丑陋)
//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,L,R,xx,tx,t,root[3000050],size,ans,op,inf=0x3fffffff,a[500050];
struct Treap{int ch[2],v,cnt,sz,rnd;}tr[3000050];
void Upd(int k){tr[k].sz=tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz+tr[k].cnt;}
void rot(int &k,bool f){int t=tr[k].ch[f];tr[k].ch[f]=tr[t].ch[!f],tr[t].ch[!f]=k,Upd(k),Upd(t),k=t;}
void ins(int &k){
if(!k){k=++size;tr[k].v=xx;tr[k].cnt=tr[k].sz=1;tr[k].rnd=rand();return;}
tr[k].sz++;
if(tr[k].v==xx){tr[k].cnt++;return;}
bool f=xx>tr[k].v;ins(tr[k].ch[f]);
if(tr[tr[k].ch[f]].rnd<tr[k].rnd)rot(k,f);
}
void del(int &k){
if(tr[k].v==tx){
if(tr[k].cnt>1)tr[k].cnt--,tr[k].sz--;
else if(tr[k].ch[0]*tr[k].ch[1]==0)k=tr[k].ch[0]+tr[k].ch[1];
else rot(k,tr[tr[k].ch[0]].rnd>=tr[tr[k].ch[1]].rnd),del(k);
}
else tr[k].sz--,del(tr[k].ch[tx>tr[k].v]);
}
void rank(int k){
if(!k)return;
if(tr[k].v==xx)ans+=tr[tr[k].ch[0]].sz;
else if(tr[k].v>xx)rank(tr[k].ch[0]);
else ans+=tr[tr[k].ch[0]].sz+tr[k].cnt,rank(tr[k].ch[1]);
}
void query(int k){
if(!k)return;
if(op==4&&tr[k].v<xx)ans=max(ans,tr[k].v),query(tr[k].ch[1]);
else if(op==4)query(tr[k].ch[0]);
else if(op==5&&tr[k].v>xx)ans=min(ans,tr[k].v),query(tr[k].ch[0]);
else query(tr[k].ch[1]);
}
void Build(int l,int r,int pos){
ins(root[pos]);if(l==r)return;
int mid=(l+r)>>1;
if(mid<t)Build(mid+1,r,pos<<1|1);
else Build(l,mid,pos<<1);
}
void Rank(int l,int r,int pos){
if(l>=L&&r<=R){rank(root[pos]);return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)Rank(mid+1,r,rson);
else if(mid>=R)Rank(l,mid,lson);
else Rank(l,mid,lson),Rank(mid+1,r,rson);
}
void Change(int l,int r,int pos){
del(root[pos]),ins(root[pos]);
if(l==r)return;
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<t)Change(mid+1,r,rson);
else Change(l,mid,lson);
}
void Ask(int l,int r,int pos){
if(l>=L&&r<=R){query(root[pos]);return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)Ask(mid+1,r,rson);
else if(mid>=R)Ask(l,mid,lson);
else Ask(l,mid,lson),Ask(mid+1,r,rson);
}
void b_srch(){
int l=0,r=inf,Ans=0;
while(l<=r){
ans=1,xx=(l+r)>>1,Rank(1,n,1);
if(ans<=tx)Ans=xx,l=xx+1;
else r=xx-1;
}
printf("%d\n",Ans);
}
int main(){
scanf("%d%d",&n,&m);
for(t=1;t<=n;t++)scanf("%d",&a[t]),xx=a[t],Build(1,n,1);
while(m--){
scanf("%d",&op);
if(op!=3){
scanf("%d%d%d",&L,&R,&xx);
if(op==1)ans=1,Rank(1,n,1),printf("%d\n",ans);
else if(op==2)tx=xx,b_srch();
else{
ans=inf;if(op==4)ans=0;Ask(1,n,1);
printf("%d\n",ans);
}
}
else scanf("%d%d",&t,&xx),tx=a[t],Change(1,n,1),a[t]=xx;
}
}
BZOJ 3196 线段树套平衡树的更多相关文章
- bzoj 2120 线段树套平衡树
先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...
- bzoj 1901 线段树套平衡树+二分答案查询
我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...
- bzoj 2141 线段树套平衡树
用树套树来解决这个问题,存储每个节点的数值是多少,然后交换 对于答案的变更可以讨论下,假设交换的是x,y位置的数x<=y 如果x=y || high[x]=high[y]则对答案没有影响 如果h ...
- bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ...
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2271 Solved: 935[Submit][Stat ...
- CF 19D - Points 线段树套平衡树
题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树. 我们先离散 ...
- BZOJ3196二逼平衡树——线段树套平衡树(treap)
此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...
- P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)
P3380 [模板]二逼平衡树(树套树) 前置芝士 P3369 [模板]普通平衡树 线段树套平衡树 这里写的是线段树+splay(不吸氧竟然卡过了) 对线段树的每个节点都维护一颗平衡树 每次把给定区间 ...
- [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)
题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...
随机推荐
- mysql 密码的破解
现在的主流的数据库一般是mysql ,sql server , oracle. 有的时候我们忘记了数据库密码的时候我们要怎么办,破解别人的数据库的密码的时候我们要怎么搞 忘记密码是一件很头痛的 ...
- python基础5(文件操作,with语句)
打开文件 #使用 open f = open('路径',mode = '打开模式', encoding='编码') #可以使用with语句打开,不需要关闭,可以同时打开多个文件 with open(' ...
- Jedis无法连接centOS7上的redis
通过查看资料无法连接基本是两个原因: 1)redis.conf中的bind配置,bind的默认是 127.0.0.1 只可本机访问,我们改为 bind 0.0.0.0 即所有地址均可访问. 2)cen ...
- POJ 1975 Median Weight Bead
Median Weight Bead Time Limit: 1000ms Memory Limit: 30000KB This problem will be judged on PKU. Orig ...
- iOS:UISplitViewController的创建
UISplitViewController是iPad特有的系统方法,主要效果就是呈现iPad的经典切割界面 代码创建实例: - (BOOL)application:(UIApplication *)a ...
- [Javascript] Transduce over any Iteratable Collection
So far we've been transducing by manually calling .reduce() on arrays, but we want to be able to tra ...
- wsimport 使用方法具体解释
wsimport 使用方法 本文主要介绍wsimport的简单使用方法.帮助大家在webserviceclient开发过程中生成接口代码: 打开java JDK文件夹我们会看到wsimport工具,这 ...
- 递归神经网络——就是解决AST这样的问题
原文:https://zybuluo.com/hanbingtao/note/626300 有时候把句子看做是词的序列是不够的,比如下面这句话『两个外语学院的学生』: 上图显示了这句话的两个不同的语法 ...
- MySql-Error: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
MySql-Error: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 标签( ...
- POJ 3661 DP
题意: 思路: i表示到了i,j表示疲劳度为j f[i][j]表示能跑的最大距离 f[i][j]=f[i-1][j-1]+a[i] if(i-j>=0)f[i][0]=max(f[i][0],f ...