P3380 【模板】二逼平衡树(树套树)

题目描述

您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:

  1. 查询k在区间内的排名

  2. 查询区间内排名为k的值

  3. 修改某一位值上的数值

  4. 查询k在区间内的前驱(前驱定义为严格小于x,且最大的数,若不存在输出-2147483647)

  5. 查询k在区间内的后继(后继定义为严格大于x,且最小的数,若不存在输出2147483647)

注意上面两条要求和tyvj或者bzoj不一样,请注意

输入输出格式

输入格式:

第一行两个数 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的后继

输出格式:

对于操作1,2,4,5各输出一行,表示查询结果

输入输出样例

输入样例#1: 复制

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 5
输出样例#1: 复制

2
4
3
4
9

说明

时空限制:2s,128M

n,m \leq 5\cdot {10}^4n,m≤5⋅104 保证有序序列所有值在任何时刻满足 [0, {10} ^8][0,108]

题目来源:bzoj3196 / Tyvj1730 二逼平衡树,在此鸣谢

此数据为洛谷原创。(特别提醒:此数据不保证操作5、6一定存在,故请务必考虑不存在的情况)

 #include<cstdio>
#include<iostream>
#include<algorithm>
#define maxn 50010
#define maxm 50010*400
using namespace std;
int n,m,tot,root[maxn],a[maxn],hash[maxn*],A[],B[];
struct node{int op,opl,opr,opk;}e[maxn];
struct S_T{
int cnt,lc[maxm],rc[maxm],sum[maxm];
void insert(int &k,int l,int r,int pos,int w){
if(!k)k=++cnt;
sum[k]+=w;
if(l==r)return;
int mid=(l+r)>>;
if(pos<=mid)insert(lc[k],l,mid,pos,w);
else insert(rc[k],mid+,r,pos,w);
}
int getrank(int l,int r,int w,bool ty){
int tmp=;
if(l==r){
if(!ty)return ;
else{
for(int i=;i<=A[];i++)tmp+=sum[A[i]];
for(int i=;i<=B[];i++)tmp-=sum[B[i]];
return tmp;
}
}
for(int i=;i<=A[];i++)tmp+=sum[lc[A[i]]];
for(int i=;i<=B[];i++)tmp-=sum[lc[B[i]]];
int mid=(l+r)>>;
if(w<=mid){
for(int i=;i<=A[];i++)A[i]=lc[A[i]];
for(int i=;i<=B[];i++)B[i]=lc[B[i]];
return getrank(l,mid,w,ty);
}
else {
for(int i=;i<=A[];i++)A[i]=rc[A[i]];
for(int i=;i<=B[];i++)B[i]=rc[B[i]];
return tmp+getrank(mid+,r,w,ty);
}
}
int getnum(int l,int r,int w){
if(l==r)return hash[l];
int tmp=;
for(int i=;i<=A[];i++)tmp+=sum[lc[A[i]]];
for(int i=;i<=B[];i++)tmp-=sum[lc[B[i]]];
int mid=(l+r)>>;
if(w<=tmp){
for(int i=;i<=A[];i++)A[i]=lc[A[i]];
for(int i=;i<=B[];i++)B[i]=lc[B[i]];
return getnum(l,mid,w);
}
else{
for(int i=;i<=A[];i++)A[i]=rc[A[i]];
for(int i=;i<=B[];i++)B[i]=rc[B[i]];
return getnum(mid+,r,w-tmp);
}
}
}ST;
struct B_I_T{
void add(int pos,int key,int val){
while(pos<=n){
ST.insert(root[pos],,tot,key,val);
pos+=pos&(-pos);
}
}
int qrank(int l,int r,int k,bool ty){
A[]=;while(r)A[++A[]]=root[r],r-=r&(-r);
B[]=;while(l)B[++B[]]=root[l],l-=l&(-l);
return ST.getrank(,tot,k,ty);
}
int qnum(int l,int r,int k){
A[]=;while(r)A[++A[]]=root[r],r-=r&(-r);
B[]=;while(l)B[++B[]]=root[l],l-=l&(-l);
return ST.getnum(,tot,k);
}
void modify(int pos,int w){
A[]=;int tmp=pos;
while(pos<=n)A[++A[]]=pos,pos+=pos&(-pos);
for(int i=;i<=A[];i++)ST.insert(root[A[i]],,tot,a[tmp],-);
for(int i=;i<=A[];i++)ST.insert(root[A[i]],,tot,w,);
a[tmp]=w;
}
}BIT;
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]),hash[i]=a[i];
int opt,l,r,k,tmp=n;
for(int i=;i<=m;i++){
scanf("%d",&opt);
if(opt==)scanf("%d%d",&l,&k);
else scanf("%d%d%d",&l,&r,&k);
e[i].op=opt;e[i].opl=l;e[i].opk=k;
if(opt!=)e[i].opr=r;
if(opt!=)hash[++tmp]=k;
}
sort(hash+,hash+tmp+);
tot=unique(hash+,hash+tmp+)-(hash+);
for(int i=;i<=n;i++){
a[i]=lower_bound(hash+,hash+tot+,a[i])-hash;
BIT.add(i,a[i],);
}
for(int i=;i<=m;i++)
if(e[i].op!=)e[i].opk=lower_bound(hash+,hash+tot+,e[i].opk)-hash; for(int i=;i<=m;i++){
if(e[i].op==)printf("%d\n",BIT.qrank(e[i].opl-,e[i].opr,e[i].opk,)+);
else if(e[i].op==)printf("%d\n",BIT.qnum(e[i].opl-,e[i].opr,e[i].opk));
else if(e[i].op==)BIT.modify(e[i].opl,e[i].opk);
else if(e[i].op==){
int tmp=BIT.qrank(e[i].opl-,e[i].opr,e[i].opk,);
if(!tmp)puts("-2147483647");
else printf("%d\n",BIT.qnum(e[i].opl-,e[i].opr,tmp));
}
else{
int tmp=BIT.qrank(e[i].opl-,e[i].opr,e[i].opk,);
if(tmp==e[i].opr-e[i].opl+)puts("");
else printf("%d\n",BIT.qnum(e[i].opl-,e[i].opr,tmp+));
}
}
}

洛谷P3380 【模板】二逼平衡树(树套树)(线段树+树状数组)的更多相关文章

  1. BZOJ3196 & 洛谷3380:二逼平衡树——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3196 https://www.luogu.org/problemnew/show/P3380 (题 ...

  2. 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...

  3. 洛谷P5284 [十二省联考2019]字符串问题 [后缀树]

    传送门 思路 设\(dp_i\)表示以\(i\)结尾的\(A\)串,能达到的最长长度. 然后发现这显然可以\(i\)往自己控制的\(k\)连边,\(k\)往能匹配的\(j\)连边,就是个最长路,只要建 ...

  4. 洛谷.3835.[模板]可持久化平衡树(fhq treap)

    题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...

  5. 洛谷 P3380 【模板】二逼平衡树(树套树)-线段树套splay

    P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...

  6. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

  7. P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)

    P3380 [模板]二逼平衡树(树套树) 前置芝士 P3369 [模板]普通平衡树 线段树套平衡树 这里写的是线段树+splay(不吸氧竟然卡过了) 对线段树的每个节点都维护一颗平衡树 每次把给定区间 ...

  8. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  9. 「luogu3380」【模板】二逼平衡树(树套树)

    「luogu3380」[模板]二逼平衡树(树套树) 传送门 我写的树套树--线段树套平衡树. 线段树上的每一个节点都是一棵 \(\text{FHQ Treap}\) ,然后我们就可以根据平衡树的基本操 ...

随机推荐

  1. 手把手编写PHP框架 深入了解MVC运行流程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  2. 更新github上代码

    前面一篇已经实现首次上传代码到github了,本篇继续讲如何把本地更新的代码同步更新到github上 一.clone代码 1.把大神的代码clone到本地,或者clone自己github上的代码,使用 ...

  3. redis学习--String数据类型。

    本文摘自:http://www.cnblogs.com/stephen-liu74/archive/2012/03/14/2349815.html 一.概述: 字符串类型是Redis中最为基础的数据存 ...

  4. 优秀开源项目之一:视频监控系统iSpy

    iSpy是一个开源的视频监控软件,目前已经支持中文.自己用了一下,感觉还是很好用的.翻译了一下它的介绍. iSpy将PC变成一个完整的安全和监控系统 iSpy使用您的摄像头和麦克风来检测和记录声音或运 ...

  5. bzoj 4822~4824 CQOI2017题解

    老C的任务 题目大意: 维护一个二维平面,初始给出一些点及其权.多次询问某个矩形内的权和. n,m <= 100000 题解: 签到题. CDQ水一水. #include <cstdio& ...

  6. java的HashMap的几个问题

    HashMap处理hash冲突的几种方法 一. 开放定址法 Hi=(H(key) + di) MOD m i=1,2,...k(k<=m-1)其中H(key)为哈希函数:m为哈希表表长:di为增 ...

  7. bzoj 1101 Zap —— 莫比乌斯反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 直接莫比乌斯反演. 代码如下: #include<cstdio> #inc ...

  8. 电子商务网站SQL注入项目实战一例(转载)

    故事A段:发现整站SQL对外输出: 有个朋友的网站,由于是外包项目,深圳某公司开发的,某天我帮他检测了一下网站相关情况. 我查看了页面源代码,发现了个惊人的事情,竟然整站打印SQL到Html里,着实吓 ...

  9. 使用hibernate validator出现

    1.javax.validation.UnexpectedTypeException: No validator could be found for type: java.lang.Integer ...

  10. 杂项:Code(开源资源)

    ylbtech-杂项:Code(开源资源) 1.返回顶部 1.CSDN http://code.csdn.net/ 2.腾讯·开源 http://code.tencent.com/ 3. 4. 5. ...