BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)
我实在是不想再打一遍树状数组套替罪羊树了。。。
然后在普通平衡树瞎逛的时候找到了以前看过vector题解
于是我想:为啥不把平衡树换成vector呢???
然后我又去学了一下ZKW线段树
就用ZKW线段树套vector水过啦!!!
每个ZKW线段树的节点保存一个vector
操作1在分出的vector上查询比它小的数有多少个然后相加再加1
操作2二分再上操作1
操作3修改需要修改的节点的vector
操作4在分出vector上查询前驱取最大
操作5与操作4同理
luogu主站5772ms上卡过,开O2的话2296ms,bzoj上8196ms,COGS上直接过
// It is made by XZZ
#include<cstdio>
#include<algorithm>
#include<vector>
#define il inline
#define rg register
#define vd void
#define sta static
using std::vector;
typedef long long ll;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=50001;
int lb[maxn],W[maxn],n,N=65536,m;
typedef const int& fast;
vector<int>d[65537<<1];
vector<int>::iterator it;
il vd Insert(fast x,fast y){d[x].insert(upper_bound(d[x].begin(),d[x].end(),y),y);}
il vd Erase(fast x,fast y){d[x].erase(lower_bound(d[x].begin(),d[x].end(),y));}
il int Rank(fast x,fast y){return lower_bound(d[x].begin(),d[x].end(),y)-d[x].begin();}
il int Kth(fast x,fast y){return d[x][y-1];}
il int Prev(fast x,fast y){
it=lower_bound(d[x].begin(),d[x].end(),y);
if(it==d[x].begin())return -2147483647;
return *--it;
}
il int Next(fast x,fast y){
it=upper_bound(d[x].begin(),d[x].end(),y);
if(it==d[x].end())return 2147483647;
return *it;
}
il vd UPD1(rg int x,fast y){for(x+=N;x;x>>=1)Insert(x,y);}
il vd UPD2(rg int x,fast y){for(x+=N;x;x>>=1)Erase(x,y);}
il int max(fast a,fast b){return a>b?a:b;}
il int min(fast a,fast b){return a<b?a:b;}
il int RNK(rg int l,rg int r,fast k){
sta int ret;ret=1;
for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1){
if(~l&1)ret+=Rank(l^1,k);
if(r&1)ret+=Rank(r^1,k);
}return ret;
}
il int PRE(rg int l,rg int r,fast k){
sta int ret;ret=-2147483647;
for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1){
if(~l&1)ret=max(ret,Prev(l^1,k));
if(r&1)ret=max(ret,Prev(r^1,k));
}return ret;
}
il int NXT(rg int l,rg int r,fast k){
sta int ret;ret=2147483647;
for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1){
if(~l&1)ret=min(ret,Next(l^1,k));
if(r&1)ret=min(ret,Next(r^1,k));
}return ret;
}
int main(){
n=gi(),m=gi();
for(N=1;N<n;N<<=1)
for(rg int i=1;i<=n;++i)lb[i]=i&-i;
for(rg int i=1;i<=n;++i){
W[i]=gi();
UPD1(i,W[i]);
}
int opt,l,r,k;
while(m--){
opt=gi();
if(opt==3)l=gi(),k=gi();
else l=gi(),r=gi(),k=gi();
if(opt==1)printf("%d\n",RNK(l,r,k));
else if(opt==2){
sta int ll,rr,mid;
ll=0,rr=100000000;
while(ll<rr){
mid=((ll+rr)>>1)+1;
if(RNK(l,r,mid)>k)rr=mid-1;
else ll=mid;
}printf("%d\n",ll);
}else if(opt==3)UPD2(l,W[l]),UPD1(l,W[l]=k);
else if(opt==4)printf("%d\n",PRE(l,r,k));
else if(opt==5)printf("%d\n",NXT(l,r,k));
else while(1);
}
return 0;
}
BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)的更多相关文章
- BZOJ3196 二逼平衡树 【线段树套平衡树】
题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在区间内的前驱(前驱 ...
- bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1807 Solved: 772[Submit][Stat ...
- bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ...
- BZOJ 3196 Tyvj 1730 二逼平衡树:线段树套splay
传送门 题意 给你一个长度为 $ n $ 有序数列 $ a $ ,进行 $ m $ 次操作,操作有如下几种: 查询 $ k $ 在区间 $ [l,r] $ 内的排名 查询区间 $ [l,r] $ 内排 ...
- [BZOJ3196] [Tyvj1730] 二逼平衡树(线段树 套 Splay)
传送门 至少BZOJ过了,其他的直接弃. 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的 ...
- bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】
四舍五入就是个暴力. 对于线段树的每个区间都开一棵按权值排序的splay 对于第二个操作,二分一下,每次查询mid的排名,复杂度 $ O(nlog(n)^{3}) $ 其余的操作都是$ O(nlog( ...
- 【bzoj3196-二逼平衡树】线段树套平衡树
http://acm.hust.edu.cn/vjudge/problem/42297 [题目描述] 写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间 ...
- BZOJ3196二逼平衡树——线段树套平衡树(treap)
此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...
- bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
随机推荐
- c基础_笔记_1
定义变量 int i; 也可以 int i,num; 赋值,c必须先定义变量再赋值 num = 0; 循环for for(i=1; i<=0; i++) { printf("%d \n ...
- [翻译] AYVibrantButton
AYVibrantButton https://github.com/a1anyip/AYVibrantButton AYVibrantButton is a stylish button with ...
- 用字典给Model赋值
用字典给Model赋值 此篇教程讲述通过runtime扩展NSObject,可以直接用字典给Model赋值,这是相当有用的技术呢. 源码: NSObject+Properties.h 与 NSObje ...
- 处理过期的archivelog和rman备份
当手工删除了归档日志以后,Rman备份会检测到日志缺失,从而无法进一步继续执行.所以此时需要手工执行crosscheck过程,之后Rman备份可以恢复正常.[执行顺序如下:手工删除archivelog ...
- 将本地已有项目上传到github
1.在github上创建一个文件 2.看本地C盘中是否有.ssh文件夹 (C:\Users\用户名\.ssh) 检测有没有.ssh文件夹:执行命令 cd ~/.ssh 如果没有的话执行git命令: ...
- python第十六课——ascii码
2.ascii码 美国设计出来的一张编码表,将涉及的字符都编号了,底层仍然还是进行二进制的运算: 记住:3个范围段 1).'0' --> 码值:48 2).'A' --> 码值:65 3) ...
- golang xorm应用
github.com/go-xorm/xorm xorm库 http://www.xorm.io/docs/ 手册 xorm是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便.xo ...
- 【洛谷】【动态规划(多维)】P1006 传纸条
[题目描述:] 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸 ...
- Java基础加强之代理
本文引用自 http://www.cnblogs.com/xdp-gacl/p/3971367.html 1.什么是代理 动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础, ...
- lvm xfs 扩容
lvresize -L 300M /dev/vg1/lv1 #重新设定大小 e2fsck -f /dev/vg1/lv1 #检查磁盘错误 (针对ext4执行) resize2fs /dev/vg1/l ...