[TYVJ1730]二逼平衡树
[TYVJ1730]二逼平衡树
题目
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:
1.查询k在区间内的排名
2.查询区间内排名为k的值
3.修改某一位值上的数值
4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)
5.查询k在区间内的后继(后继定义为大于x,且最小的数)INPUT
第一行两个数 n,m 表示长度为n的有序序列和m个操作
第二行有n个数,表示有序序列
下面有m行,opt表示操作标号
若opt=1 则为操作1,之后有三个数l,r,k 表示查询k在区间[l,r]的排名
若opt=2 则为操作2,之后有三个数l,r,k 表示查询区间[l,r]内排名为k的数
若opt=3 则为操作3,之后有两个数pos,k 表示将pos位置的数修改为k
若opt=4 则为操作4,之后有三个数l,r,k 表示查询区间[l,r]内k的前驱
若opt=5 则为操作5,之后有三个数l,r,k 表示查询区间[l,r]内k的后继OUTPUT
对于操作1,2,4,5各输出一行,表示查询结果
SAMPLE
INPUT
9 6
4 2 2 1 9 4 0 1 1
2 1 4 3
3 4 10
2 1 4 3
1 2 5 9
4 3 9 5
5 2 8 5OUTPUT
2
4
3
4
9
解题报告
线段树套平衡树裸题,瞎XX打,轻松1A
别问我为啥BZOJ上RE了一次,srand有毒
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<ctime>
using namespace std;
inline int read(){
int sum(),f();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar())
if(ch=='-')
f=-;
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum*f;
}
#define get_size(x) (x?x->size:0)
struct node{
node *lch,*rch;
int size,key,fix;
node(int x=):lch(NULL),rch(NULL),size(),key(x),fix(rand()){}
inline void pushup(){
this->size=get_size(this->lch)+get_size(this->rch)+;
}
}*tr[];
inline void left_rotate(node *&x){
node *tmp(x->rch);
x->rch=tmp->lch;
tmp->lch=x;
x->pushup();
tmp->pushup();
x=tmp;
}
inline void right_rotate(node *&x){
node *tmp(x->lch);
x->lch=tmp->rch;
tmp->rch=x;
x->pushup();
tmp->pushup();
x=tmp;
}
inline void insert(node *&x,int v){
if(!x){
x=new node(v);
return;
}
if(v<=x->key){
insert(x->lch,v);
x->pushup();
if(x->lch->fix<x->fix)
right_rotate(x);
}
else{
insert(x->rch,v);
x->pushup();
if(x->rch->fix<x->fix)
left_rotate(x);
}
}
inline void del(node *&x,int v){
if(x->key==v){
if(x->lch&&x->rch){
if(x->lch->fix<x->rch->fix){
right_rotate(x);
del(x->rch,v);
}
else{
left_rotate(x);
del(x->lch,v);
}
}
else{
node *tmp(NULL);
if(x->lch)
tmp=x->lch;
else
tmp=x->rch;
delete x;
x=tmp;
}
}
else{
if(v<=x->key)
del(x->lch,v);
else
del(x->rch,v);
}
if(x)
x->pushup();
}
inline int Rank(node *now,int x){
int ret();
while(now){
if(x<=now->key)
now=now->lch;
else
ret+=get_size(now->lch)+,now=now->rch;
}
return ret;
}
inline int kth(node *now,int k){
while(now){
if(get_size(now->lch)+==k)
return now->key;
if(get_size(now->lch)+>=k)
now=now->lch;
else
k-=get_size(now->lch)+,now=now->rch;
}
}
int n,m;
int a[];
inline void build(int l,int r,int rt){
for(int i=l;i<=r;++i)
insert(tr[rt],a[i]);
if(l==r)return;
int mid((l+r)>>);
build(l,mid,rt<<);
build(mid+,r,rt<<|);
}
inline int Rank(int ll,int rr,int k,int l,int r,int i){
if(ll<=l&&r<=rr)
return Rank(tr[i],k);
int mid((l+r)>>),ret();
if(ll<=mid)
ret+=Rank(ll,rr,k,l,mid,i<<);
if(mid<rr)
ret+=Rank(ll,rr,k,mid+,r,i<<|);
return ret;
}
inline int kth(int l,int r,int k){
int ll(),rr(1e8);
while(ll<=rr){
int mid((ll+rr)>>);
int jud(Rank(l,r,mid,,n,)+);
if(jud<=k)
ll=mid+;
else
rr=mid-;
}
return rr;
}
inline void update(int pos,int w,int l,int r,int i){
del(tr[i],a[pos]);
insert(tr[i],w);
if(l==r)return;
int mid((l+r)>>);
if(pos<=mid)
update(pos,w,l,mid,i<<);
else
update(pos,w,mid+,r,i<<|);
}
inline int gg(){
// freopen("psh.in","r",stdin);
// freopen("psh.out","w",stdout);
// srand(time(NULL));
n=read(),m=read();
for(int i=;i<=n;++i)
a[i]=read();
build(,n,);
while(m--){
int op(read());
if(op==){
int x(read()),y(read()),z(read());
printf("%d\n",Rank(x,y,z,,n,)+);
}
if(op==){
int x(read()),y(read()),z(read());
printf("%d\n",kth(x,y,z));
}
if(op==){
int x(read()),y(read());
update(x,y,,n,);
a[x]=y;
}
if(op==){
int x(read()),y(read()),z(read());
printf("%d\n",kth(x,y,Rank(x,y,z,,n,)));
}
if(op==){
int x(read()),y(read()),z(read());
printf("%d\n",kth(x,y,Rank(x,y,z+,,n,)+));
}
}
return ;
}
int K(gg());
int main(){;}
[TYVJ1730]二逼平衡树的更多相关文章
- BZOJ3196 Tyvj1730 二逼平衡树 【树套树】 【线段树套treap】
BZOJ3196 Tyvj1730 二逼平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名 ...
- [BZOJ3196][Tyvj1730]二逼平衡树
[BZOJ3196][Tyvj1730]二逼平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询 \(k\) 在区间内的排名 查询区间内排名为 \ ...
- [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...
- 【bzoj3196】 Tyvj1730—二逼平衡树
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 (题目链接) 题意 1.查询k在区间内的排名:2.查询区间内排名为k的值:3.修改某一位值上的 ...
- bzoj3196 [TYVJ1730]二逼平衡树 树套树 线段树套替罪羊树
人傻自带大常数 二分的可行性证明: 贴近他的正确答案不会被当作次优解删掉,因为,若二分在他右边发生,那么二分一定会把左边作为优解,左边同理,所以他一定是被扣掉的所以最后一个小于等于一定是正确答案 #i ...
- bzoj3196:Tyvj1730二逼平衡树
传送门 暴力啊,直接树套树上啊 线段树套splay,卡卡常就直接A了 代码: #include<cstdio> #include<iostream> #include<a ...
- [BZOJ3196] [Tyvj1730] 二逼平衡树(线段树 套 Splay)
传送门 至少BZOJ过了,其他的直接弃. 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的 ...
- 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)
[模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...
- [Tyvj 1730] 二逼平衡树
先来一发题面QwQ [TYVJ1730]二逼平衡树 Time Limit:2 s Memory Limit:512 MB Description 您需要写一种数据结构(可参考题目标题),来维护一个 ...
随机推荐
- 特征变化--->标签到索引的转换(StringIndexer)
package Spark_MLlib import org.apache.spark.ml.feature.StringIndexer import org.apache.spark.sql.Spa ...
- zabbix监控kafka消费
一.Kafka监控的几个指标 1.lag:多少消息没有消费 lag=logsize-offset 2.logsize:Kafka存的消息总数 3.offset:已经消费的消息 Kafka管理工具 介绍 ...
- codevs1486愚蠢的矿工(树形dp)
1486 愚蠢的矿工 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description Stupid 家族得知在HYC家的后花园里的中央花坛处,向北走3步,向西走3步, ...
- 汇编程序45:检测点13.2 (loop指令的中断例程)
安装程序: assume cs:code //loop指令的替代实现 code segment start: mov ax,cs mov ds,ax mov si,offset sub1 mov ax ...
- BZOJ 5277 IQ题orz
思路: 首先我们注意到,对一个序列按分割点分开以后分别冒泡其实就相当于对整个序列进行冒泡.每一个元素都会对复杂度贡献1,除非一个元素两边的分割点都出现了.因此我们可以完全忽略快排的递归过程.只需考虑每 ...
- js-消息对话框
最近在某技术网站学习一些js(JavaScript)的课程,将笔记分享一下 消息对话框1. **alert **消息对话框,输出内容,可以是字符串或变量,与document.write 相似 va ...
- 开发日记(项目中SQL查询的优化)
今天发现自己之前写的一些SQL查询在执行效率方面非常不理想,于是尝试做了些改进. 需求为查询国地税表和税源表中,国税有而税源没有的条目数,之前的查询如下: SELECT COUNT(NAME) ...
- JS——思维拓展
1.阶乘求和:4的阶乘是1*2*3*4 <script> function jiechen(value) { var n = 1; for (var i = 1; i <= valu ...
- CSS——盒子
CSS中的盒子具有以下几个种重要的属性: 1.border(边框) :盒子的厚度 2.padding(内边距):盒子内容距离盒子边框的距离 3.margin(外边距):盒子边框与其他的盒子的距离
- [Windows Server 2008] 查看ASP.net详细错误信息
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:查看IIS ...