[POJ2104] K – th Number (可持久化线段树 主席树)
题目背景
这是个非常经典的主席树入门题——静态区间第K小
数据已经过加强,请使用主席树。同时请注意常数优化
题目描述
如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值。
输入输出格式
输入格式:
第一行包含两个正整数N、M,分别表示序列的长度和查询的个数。
第二行包含N个正整数,表示这个序列各项的数字。
接下来M行每行包含三个整数 l, r, kl,r,k , 表示查询区间 [l, r][l,r] 内的第k小值。
输出格式:
输出包含k行,每行1个正整数,依次表示每一次查询的结果
输入输出样例
输入样例#1:
5 5
25957 6405 15770 26287 26465
2 2 1
3 4 1
4 5 1
1 2 2
4 4 1
输出样例#1:
6405
15770
26287
25957
26287
说明
数据范围:
对于20%的数据满足: 1 \leq N, M \leq 101≤N,M≤10
对于50%的数据满足: 1 \leq N, M \leq 10^31≤N,M≤10
3
对于80%的数据满足: 1 \leq N, M \leq 10^51≤N,M≤10
5
对于100%的数据满足: 1 \leq N, M \leq 2\cdot 10^51≤N,M≤2⋅10
5
对于数列中的所有数 a_ia
i
,均满足 -{10}^9 \leq a_i \leq {10}^9−10
9
≤a
i
≤10
9
样例数据说明:
N=5,数列长度为5,数列从第一项开始依次为 [25957, 6405, 15770, 26287, 26465 ][25957,6405,15770,26287,26465]
第一次查询为 [2, 2][2,2] 区间内的第一小值,即为6405
第二次查询为 [3, 4][3,4] 区间内的第一小值,即为15770
第三次查询为 [4, 5][4,5] 区间内的第一小值,即为26287
第四次查询为 [1, 2][1,2] 区间内的第二小值,即为25957
第五次查询为 [4, 4][4,4] 区间内的第一小值,即为26287
code:
//By Menteur_Hxy
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
#define f(a,b,c) for(int a=b;a<=c;a++)
using namespace std;
inline ll rd() {
ll x=0,fla=1; char c=' ';
while(c>'9'|| c<'0') {if(c=='-') fla=-fla; c=getchar();}
while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();
return x*fla;
}
inline void out(ll x){
int a[25],wei=0;
if(x<0) putchar('-'),x=-x;
for(;x;x/=10) a[++wei]=x%10;
if(wei==0){ puts("0"); return;}
for(int j=wei;j>=1;--j) putchar('0'+a[j]);
putchar('\n');
}
const int MAX=300010;
const int INF=0x3f3f3f3f;
int n,m,N,tot;
int a[MAX],v[MAX],si[MAX*100],ls[MAX*100],rs[MAX*100],rt[MAX];
int isrt(int o,int l,int r,int d) {
int cur=++tot;
si[cur]=si[o]+1;
if(l==r) ls[cur]=ls[o],rs[cur]=rs[o];
else {
int mid=(l+r)>>1;
if(d<=mid) ls[cur]=isrt(ls[o],l,mid,d),rs[cur]=rs[o];
else rs[cur]=isrt(rs[o],mid+1,r,d),ls[cur]=ls[o];
}
return cur;
}
int query(int o1,int o2,int l,int r,int k) {
if(l==r) return l;
int mid=(l+r)>>1,sum=si[ls[o2]]-si[ls[o1]];
if(k<=sum) return query(ls[o1],ls[o2],l,mid,k);
else return query(rs[o1],rs[o2],mid+1,r,k-sum);
}
int main() {
n=rd(),m=rd();
f(i,1,n) a[i]=rd(),v[i]=a[i];
sort(v+1,v+n+1);
N=unique(v+1,v+n+1)-v-1;
f(i,1,n) a[i]=lower_bound(v+1,v+N+1,a[i])-v;
f(i,1,n) rt[i]=isrt(rt[i-1],1,N,a[i]);
while(m--) {
int l=rd(),r=rd(),k=rd();
out(v[query(rt[l-1],rt[r],1,N,k)]);
}
return 0;
}
[POJ2104] K – th Number (可持久化线段树 主席树)的更多相关文章
- 洛谷P3834 可持久化线段树(主席树)模板
题目:https://www.luogu.org/problemnew/show/P3834 无法忍受了,我要写主席树! 解决区间第 k 大查询问题,可以用主席树,像前缀和一样建立 n 棵前缀区间的权 ...
- 线段树简单入门 (含普通线段树, zkw线段树, 主席树)
线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]
可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...
- SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)
题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...
- hihocoder#1046 K个串 可持久化线段树 + 堆
首先考虑二分,然后发现不可行.... 注意到\(k\)十分小,尝试从这里突破 首先用扫描线来处理出以每个节点为右端点的区间的权值和,用可持久化线段树存下来 在所有的右端点相同的区间中,挑一个权值最大的 ...
- 【BZOJ4504】K个串 可持久化线段树+堆
[BZOJ4504]K个串 Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计 ...
- bzoj 4504: K个串 可持久化线段树+堆
题目: Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想 ...
- 树上第k小,可持久化线段树+倍增lca
给定一颗树,树的每个结点都有权值, 有q个询问,每个询问是 u v k ,表示u到v路径上第k小的权值是多少. 每个结点所表示的线段树,是父亲结点的线段树添加该结点的权值之后形成的新的线段树 c[ro ...
随机推荐
- Linux文字分段裁剪命令cut(转)
Linux cut命令用于显示每行从开头算起num1到num2的文字. 语法 cut [-bn] [file] cut [-c] [file] cut [-df] [file] 使用说明: cut命令 ...
- hdu1018--斯特灵公式
斯特灵公式 Wiki http://zh.wikipedia.org/wiki/斯特林公式 /** \brief hdu 1018 * * \param date 2014/7/24 * \param ...
- luogu1120 小木棍【数据加强版】 暴力剪枝
题目大意 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度.给出每段小木棍的长度,编程帮 ...
- poj 1321(DFS)
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...
- CodeForces 131C C (组合)
There are n boys and m girls attending a theatre club. To set a play "The Big Bang Theory" ...
- 【BZOJ1565】【NOI2009】植物大战僵尸
好久没写博客了 题目 题目在这里 思路&做法 没什么好说的 应该很容易看出是 最大闭合子图 吧? 不过要注意一下的是,这题 可能有植物是不可能被击溃的 , 所以要先跑一遍 拓扑排序 把这些点排 ...
- 【BZOJ1597】【Usaco2008 Mar】土地购买 斜率优化DP
题目: 题目在这里 思路与做法: 这题如果想要直接dp的话不太好处理. 不过, 我们发现如果\(a[i].x>=a[j].x\)且\(a[i].y>=a[j].y\) \((\)a是输入的 ...
- 20. Valid Parentheses[E]有效的括号
题目 Given a string containing just the characters '(',')','[',']','{' and '}',determine if the input ...
- MVC学习日记(三)EntityFramework
其实学会了第一篇的创建和第二篇的使用以后,基本的mvc操作足够了,至于验证神马的,还不如用Jquery.h5的好看适用,所以接下来, 后续上会讲一些比较实用的. 在之前的文章说到了基础的使用, 那么, ...
- ItemArray DataRow对象的RowState和DataRowVersion属性特点
DataTable.Rows[i].ItemArray DataTable.Rows表示所有行的集合DataTable.Rows[i]加上下标表示其中某一行DataTable.Rows[i].Item ...