POJ2104 —— K-th number
1、题目大意:区间第k小,什么修改没有。。。
2、分析:这个是可持久化线段树,也是主席树,解释一下,n个线段树是怎么存下的,就是每一颗线段树和前一个有logn个点不一样
然后我们只需要一个线段树开logn的空间,然后其他的指针指向上一个线段树对应的地方也是可以的对吧
然后。。然后就没了。。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
int a[2000010], l[2000010];
pair<int , int> b[2000010];
int T[2000010], ls[2000010], rs[2000010];
int h[2000010];
int cnt[2000010];
int tot;
int num = 0;
inline int insert(int root, int pos){
int nroot = ++ tot;
int ret = nroot;
int l = 1, r = num;
cnt[nroot] = cnt[root] + 1;
while(l < r){
int mid = (l + r) / 2;
if(pos <= mid){
r = mid;
ls[nroot] = ++ tot;
rs[nroot] = rs[root];
nroot = ls[nroot];
root = ls[root];
cnt[nroot] = cnt[root] + 1;
}
else {
l = mid + 1;
ls[nroot] = ls[root];
rs[nroot] = ++ tot;
nroot = rs[nroot];
root = rs[root];
}
cnt[nroot] = cnt[root] + 1;
}
return ret;
}
inline int query(int lll, int rrr, int k){
int l = 1, r = num;
int le_ = T[lll - 1];
int ri_ = T[rrr];
while(l < r){
int mid = (l + r) / 2;
int q = cnt[ls[ri_]] - cnt[ls[le_]];
if(k <= q){
r = mid;
le_ = ls[le_];
ri_ = ls[ri_];
}
else{
l = mid + 1;
k -= q;
le_ = rs[le_];
ri_ = rs[ri_];
}
}
return l;
}
int main(){
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++){
scanf("%d", &a[i]);
b[i] = make_pair(a[i], i);
}
sort(b + 1, b + n + 1);
b[0].first = -2147483647;
for(int i = 1; i <= n; i ++){
if(b[i].first != b[i - 1].first) num ++;
l[b[i].second] = num;
h[num] = b[i].second;
}
T[0] = 1;
tot = 1;
for(int i = 1; i <= n; i ++) T[i] = insert(T[i - 1], l[i]);
for(int i = 1; i <= m; i ++){
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
printf("%d\n", a[h[query(l, r, k)]]);
}
return 0;
}
POJ2104 —— K-th number的更多相关文章
- [POJ2104] K – th Number (可持久化线段树 主席树)
题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...
- 【POJ2104】K-th Number
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3
- C++之路进阶——poj2104(K-th Number)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44537 Accepted: 14781 Ca ...
- 【poj2104】K-th Number 主席树
题目描述 You are working for Macrohard company in data structures department. After failing your previou ...
- 【POJ2104】K-th Number(主席树)
题意:有n个数组成的序列,要求维护数据结构支持在线的下列两种操作: 1:单点修改,将第x个数修改成y 2:区间查询,询问从第x个数到第y个之间第K大的数 n<=100000,a[i]<=1 ...
- poj2104:K-th Number
思路:可持久化线段树,利用权值线段树,把建树过程看成插入,插入第i个元素就在第i-1棵树的基础上新建结点然后得到第i棵树,那么询问区间[l,r]就是第r棵树上的信息对应减去第l-1棵树上的信息,然后再 ...
- POJ2104:K-th Number——题解
http://poj.org/problem?id=2104 题目大意:求区间第k小. —————————————————————————— 主席树板子题. ……我看了半天现在还是一知半解的状态所以应 ...
- poj2104 K大数 划分树
题意:给定一个数列,求一个区间的第K大数 模板题, 其中的newl, newr 有点不明白. #include <iostream> #include <algorithm> ...
- ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number
A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...
- 整体二分初识--POJ2104:K-th Number
n<=100000个数有m<=5000个询问,每次问区间第k大. 方法一:主席树!…… 方法二:整体二分. 整体二分一次性计算半个值域对一个区间的询问的贡献,然后根据“这半边的贡献在某个询 ...
随机推荐
- mysql主从复制 转
mysql服务器的主从配置,这样可以实现读写分离,也可以在主库挂掉后从备用库中恢复.需要两台机器,安装mysql,两台机器要在相通的局域网内,可以分布在不同的服务器上,也可以在一台服务器上启动多个服务 ...
- ubuntu rhythmbox乱码解决方法
因为安装的是双系统,所以音乐文件在win的盘下面,所以采用的方法是 1. 首先,需要有软件包mid3iconv.如果你的系统中没有安装它,可以通过如下代码自动安装:sudo apt-get insta ...
- 屌丝逆袭--Asp.net快速入门学习教程 第1晚
本人屌丝一名,因工作原因,不能白天学习编程,所以只能做夜猫子学习编程,期待一天能逆袭成一名高帅富的技术大牛(靠,都想到流口水了........囧). 本教程记录本屌丝学习Asp.net的过程,大牛就飞 ...
- System.Diagnostics.Trace.Listeners
System.Diagnostics.Trace.Listeners.Clear(); System.Diagnostics.Trace.AutoFlush = true; System.Diagno ...
- wampserver 绑定域名 外部可以正常访问
wampserver使用的apache 绑定都一样 绑定的域名xuechao2010.gicp.net 端口是8989 系统是win7 64位 1.绑定域名 端口 在apache上 D:\wam ...
- 使用VMware 安装Linux CentOS7
访问百度经验 http://jingyan.baidu.com/article/eae0782787b4c01fec548535.html 安装无忧..
- FIFO学习心得
1,名字.FIFO=First in first out. 2,特点.顺序读入,顺序读出,先入先出. 3,用途.数据缓冲.使两个数据传输速率不一样的设备相匹配. 4,参数. ①,THE WIDTH和T ...
- ManualResetEvent详解
原文来自:http://www.cnblogs.com/tianzhiliang/archive/2011/03/04/1970726.html 1. 源码下载: 下载地址:http://files. ...
- Linux下用于查看系统当前登录用户信息的4种方法
1. 使用w命令查看登录用户正在使用的进程信息 w命令用于显示已经登录系统的用户的名称,以及他们正在做的事.该命令所使用的信息来源于/var/run/utmp文件.w命令输出的信息包括: 用户名称 用 ...
- 浙大PAT-1002
1002. 写出这个数 (20) 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式 ...