我实在是不想再打一遍树状数组套替罪羊树了。。。

然后在普通平衡树瞎逛的时候找到了以前看过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(滑稽)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

    http://acm.hust.edu.cn/vjudge/problem/42297 [题目描述] 写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间 ...

  8. BZOJ3196二逼平衡树——线段树套平衡树(treap)

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

  9. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

随机推荐

  1. 用UIScrollView产生视差效果

    用UIScrollView产生视差效果 效果: 高级效果: 源码: MoreInfoView.h  +  MoreInfoView.m // // MoreInfoView.h // YXCell / ...

  2. python2.7与3.5共存windows平台安装

    文:铁乐与猫 2018-3-18 周日 01.首先是安装python2.7: 官网下载 https://www.python.org 点击安装包进行安装 可以选择自定义的路径 将默认打x的[add p ...

  3. Java基础 之软引用、弱引用、虚引用 ·[转载]

    Java基础 之软引用.弱引用.虚引用 ·[转载] 2011-11-24 14:43:41 Java基础 之软引用.弱引用.虚引用 浏览(509)|评论(1)   交流分类:Java|笔记分类: Ja ...

  4. QT5.8连接Mysql提示QMYSQL driver not loaded

    我们都知道在QT5.8系列里已经带了Mysql的dll文件 驱动的名字为“qsqlmysql.dll”和“qsqlmysqld.dll” 但是按照网上的各种教程和博客基本都是错的,只有个别人是对的. ...

  5. this 的使用方法 —— javascript中的this讲解!

    从自己刚刚开始学习javascript到现在已经很久了,今天得益于新酱的细心讲解,总算是把this这个“雾中花”看清晰了. 在此首先感谢新酱的讲解 下面将this的一些基本使用和大家分享一下: 查看t ...

  6. 第三部分 OpenStack镜像管理

    一.简介 很多源都有为OpenStack已经编译好的各种镜像了,您可以直接下载并通过使用这些镜像来熟悉OpenStack. 不过如果是为生产环境进行部署的话,您一定需要构建含有定制软件或配置的镜像文件 ...

  7. linq to sql 分页技术

    昨天在用LINQ写分页的时候碰到一个很奇怪的问题:翻页的时候,有的数据会莫名其妙地消失,查了半个多小时才发现问题所在,其实是一个很细节的地方. 数据表如下: LINQ分页的实现是: var artic ...

  8. Windows下docker的安装,将ASP.NET Core程序部署在Linux和Docker中

    参考文章: https://www.cnblogs.com/jRoger/p/aspnet-core-deploy-to-docker.html docker for windows下载连接: htt ...

  9. IPython学习笔记(一)

    开始看<利用python进行数据分析>这一本书,记录下学习的点滴,对于每一个小知识点记录得过于详细,但是好记性不如烂笔头,动动手还是记得比较深刻点. 1.Tab自动补齐 输入an后按Tab ...

  10. ajax表单提交post(错误400) 序列化表单(post表单转换json(序列化))

    序列化表单 使用serializeArray()序列化 转换成json格式 function arrayTOjson(node) { var b = "{"; for (var i ...