洛谷P3380 【模板】二逼平衡树(树套树)(线段树+树状数组)
P3380 【模板】二逼平衡树(树套树)
题目描述
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:
查询k在区间内的排名
查询区间内排名为k的值
修改某一位值上的数值
查询k在区间内的前驱(前驱定义为严格小于x,且最大的数,若不存在输出-2147483647)
- 查询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各输出一行,表示查询结果
输入输出样例
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
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 【模板】二逼平衡树(树套树)(线段树+树状数组)的更多相关文章
- BZOJ3196 & 洛谷3380:二逼平衡树——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3196 https://www.luogu.org/problemnew/show/P3380 (题 ...
- 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 Treap+树状数组 1WA1A,好伤心,本来是可以直接1A的,这次开始我并没有看题解,就写出 ...
- 洛谷P5284 [十二省联考2019]字符串问题 [后缀树]
传送门 思路 设\(dp_i\)表示以\(i\)结尾的\(A\)串,能达到的最长长度. 然后发现这显然可以\(i\)往自己控制的\(k\)连边,\(k\)往能匹配的\(j\)连边,就是个最长路,只要建 ...
- 洛谷.3835.[模板]可持久化平衡树(fhq treap)
题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...
- 洛谷 P3380 【模板】二逼平衡树(树套树)-线段树套splay
P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...
- 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)
[模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...
- P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)
P3380 [模板]二逼平衡树(树套树) 前置芝士 P3369 [模板]普通平衡树 线段树套平衡树 这里写的是线段树+splay(不吸氧竟然卡过了) 对线段树的每个节点都维护一颗平衡树 每次把给定区间 ...
- 【BZOJ 3196】二逼平衡树 线段树套splay 模板题
我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...
- 「luogu3380」【模板】二逼平衡树(树套树)
「luogu3380」[模板]二逼平衡树(树套树) 传送门 我写的树套树--线段树套平衡树. 线段树上的每一个节点都是一棵 \(\text{FHQ Treap}\) ,然后我们就可以根据平衡树的基本操 ...
随机推荐
- 九 Django框架,Form表单验证
表单提交 html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Oracle 11g的7个服务详解
成功安装Oracle 11g后,共有7个服务,这七个服务的含义分别为:1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shad ...
- mybatis学习第(一)天
课程安排: Mybatis和springMVC通过订单商品案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发)问题总结 Mybatis框架原理 Mybatis的入 ...
- 3.1 第一个场景 HelloWorldScene
HelloWorldScene.h #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos ...
- 【leetcode刷题笔记】Sqrt(x)
Implement int sqrt(int x). Compute and return the square root of x. 题解:二分的方法,从0,1,2.....x搜索sqrt(x)的值 ...
- C易位构词(华师网络赛)(错排)
Time limit per test: 2.0 seconds Memory limit: 256 megabytes 易位构词 (anagram),指将一个单词中的字母重新排列,原单词中的每个字母 ...
- [Codeforces 204E] Little Elephant and Strings
[题目链接] https://codeforces.com/contest/204/problem/E [算法] 首先构建广义后缀自动机 对于自动机上的每个节点 , 维护一棵平衡树存储所有它所匹配的字 ...
- 【LeetCode】012. Integer to Roman
Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...
- Core Data存储数据出错(This NSPersistentStoreCoordinator has no persistent stores (unknown))
Core Data存储数据的时候崩溃,崩溃信息: reason: 'This NSPersistentStoreCoordinator has no persistent stores (unknow ...
- Python:模块详解及import本质
转于:http://www.cnblogs.com/itfat/p/7481972.html 博主:东大网管 一.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能), ...