静态区间第k大 树套树解法
然而过不去你谷的模板
思路:
值域线段树\([l,r]\)代表一棵值域在\([l,r]\)范围内的点构成的一颗平衡树
平衡树的\(BST\)权值为点在序列中的位置
查询区间第\(k\)大值时
左区间在\([l,r]\)范围内的树的大小与\(k\)比较
大了进去,小了减掉换一边
关于建树
递归建估计是\(O(nlog^2n)\)的
Code:
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
const int N=1e5+10;
int ch[N*20][2],val[N*20],siz[N*20],pos[N*20],root[N<<2],tot;
#define ls ch[now][0]
#define rs ch[now][1]
int n,m,n_,a[N],b[N];
void updata(int now){siz[now]=siz[ls]+siz[rs]+1;}
void split(int now,int k,int &x,int &y)
{
if(!now) {x=y=0;return;}
if(pos[now]<=k)
x=now,split(rs,k,rs,y);
else
y=now,split(ls,k,x,ls);
updata(now);
}
int Merge(int x,int y)
{
if(!x||!y) return x+y;
if(val[x]<val[y])
{
ch[x][1]=Merge(ch[x][1],y);
updata(x);
return x;
}
else
{
ch[y][0]=Merge(x,ch[y][0]);
updata(y);
return y;
}
}
int New(int k)
{
val[++tot]=rand(),pos[tot]=k,siz[tot]=1;
return tot;
}
void Insert(int id,int k)
{
int x,y;
split(root[id],k,x,y);
root[id]=Merge(x,Merge(New(k),y));
}
int ask(int id,int l,int r)//询问区间
{
int x,y,z,s;
split(root[id],r,x,y);
split(x,l-1,x,z);
s=siz[z];
root[id]=Merge(x,Merge(z,y));
return s;
}
std::vector <int> loc[N];
void build(int id,int l,int r)
{
if(l==r)
{
for(int i=0;i<loc[l].size();i++)
Insert(id,loc[l][i]);
return;
}
int mid=l+r>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
for(int i=l;i<=r;i++)
for(int j=0;j<loc[i].size();j++)
Insert(id,loc[i][j]);
}
int query(int id,int l,int r,int ql,int qr,int k)
{
if(l==r) return a[l];
int mid=l+r>>1,cnt;
if((cnt=ask(id<<1,ql,qr))>=k)
return query(id<<1,l,mid,ql,qr,k);
else
return query(id<<1|1,mid+1,r,ql,qr,k-cnt);
}
void init()
{
scanf("%d%d",&n_,&m);
for(int i=1;i<=n_;i++) scanf("%d",a+i),b[i]=a[i];
std::sort(a+1,a+1+n_);
n=std::unique(a+1,a+1+n_)-a-1;
for(int i=1;i<=n_;i++)
loc[std::lower_bound(a+1,a+1+n,b[i])-a].push_back(i);
build(1,1,n);
}
void work()
{
for(int l,r,k,i=1;i<=m;i++)
{
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",query(1,1,n,l,r,k));
}
}
int main()
{
init(),work();
return 0;
}
2018.9.2
静态区间第k大 树套树解法的更多相关文章
- 静态区间第k大(归并树)
POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...
- POJ 2104 && POJ 2761 (静态区间第k大,主席树)
查询区间第K大,而且没有修改. 使用划分树是可以做的. 作为主席树的入门题,感觉太神奇了,Orz /* *********************************************** ...
- 静态区间第k大(主席树)
POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...
- 静态区间第k大(划分树)
POJ 2104为例[经典划分树问题] 思想: 利用快速排序思想, 建树时将区间内的值与区间中值相比,小于则放入左子树,大于则放入右子树,如果相等则放入左子树直到放满区间一半. 查询时,在建树过程中利 ...
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- 主席树(静态区间第k大)
前言 如果要求一些数中的第k大值,怎么做? 可以先就这些数离散化,用线段树记录每个数字出现了多少次. ... 那么考虑用类似的方法来求静态区间第k大. 原理 假设现在要有一些数 我们可以对于每个数都建 ...
- 可持久化线段树(主席树)——静态区间第k大
主席树基本操作:静态区间第k大 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=2e5+, ...
- HDU3473--Minimum Sum(静态区间第k大)
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- 主席树学习笔记(静态区间第k大)
题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...
随机推荐
- 利用sysbench进行MySQL OLTP基准测试
Preface In order to know clearly about the real performance threshold of database server,we ...
- scrapy--ipproxy
不要急于求成,你只要做的是比昨天的你更优秀一点 --匿名 今天给大家讲一下--IpProxy,由于从"http://www.xicidaili.com/nn"爬取,以下是我转载的博 ...
- springboot搭建环境访问Controller层返回404
如果启动成功,但是却访问不了你自己写的controller,报404错误,那么原因就是您写的controller没有被spring 容器扫描到 解决方案: spring boot 默认扫描您的类是 在 ...
- centos安装Linux
CentOS下安装Redis Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计 ...
- 17-比赛2 C - Maze (dfs)
Pavel loves grid mazes. A grid maze is an n × m rectangle maze where each cell is either empty, or i ...
- 排序-InsertSort
数据结构之插入排序 参考----王道论坛2015年数据结构联考复习指南---- 算法稳定性:如果待排序表中有任意两个元素x1,x2相等,且排序前x1在x2的前面,使用某个排序算法之后,若x1仍然在x2 ...
- Hive 压缩技术Data Compression
Mapreducwe 执行流程 :input > map > shuffle > reduce > output 压缩执行时间,map 之后,压缩,数据存储在本地磁盘,减少磁盘 ...
- [bzoj3450]Tyvj1952Easy
瓜皮期望真是弱成渣.. 完全不理解的感觉qwq...题面%了一发千古神犇WJMZBMR哈~ Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化 ...
- 常用数据库连接URL地址大全
1.Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); ...
- 容器技术的落地还要依靠SDN
容器能够实现新应用程序的快速部署,代表着目前IT开发社区的最热门趋势之一.然而,想要实现容器部署生产环境,IT人员还需要使用SDN技术,在分布式微应用程序之间实现可扩展.可管理且安全的通信. 什么是容 ...