hdu2665(主席树模板题)
hdu2665
题意
求区间第 k 小。
分析
参考
这类题目做法挺多的,例如 划分树。
这里使用主席树再写一发,不得不说主席树相比而言要好写的多,比起普通线段树,主席树就是复用了线段树共有的信息。
可持久化数据结构讲究的就是复用共有的信息,可持久化 Trie 的思想也是差不多的。
code
#include<bits/stdc++.h>
using namespace std;
#define lson l, m
#define rson m + 1, r
const int MAXN = 1e5 + 10;
int L[MAXN << 5], R[MAXN << 5], sum[MAXN << 5];
int tot;
int a[MAXN], f[MAXN], h[MAXN];
int build(int l, int r) {
int rt = ++tot;
sum[rt] = 0;
if(l < r) {
int m = l + r >> 1;
L[rt] = build(lson);
R[rt] = build(rson);
}
return rt;
}
int update(int pre, int l, int r, int x) {
int rt = ++tot;
L[rt] = L[pre];
R[rt] = R[pre];
sum[rt] = sum[pre] + 1; // 先继承前面的线段树
if(l < r) {
int m = l + r >> 1;
if(x <= m) L[rt] = update(L[pre], lson, x); // 因为右边不需要更新,所以覆盖掉左边
else R[rt] = update(R[pre], rson, x); // 同理
}
return rt;
}
int query(int ql, int qr, int l, int r, int k) { // 区间[ql, qr]从小到大排序后正数第 k 个数
if(l >= r) return l;
int m = l + r >> 1;
int num = sum[L[qr]] - sum[L[ql]];
if(num >= k) return query(L[ql], L[qr], lson, k); // 左边至少有 k 个数
else return query(R[ql], R[qr], rson, k - num);
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n, m; tot = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
h[i] = a[i];
}
sort(h + 1, h + 1 + n);
int d = unique(h + 1, h + 1 + n) - h - 1;
f[0] = build(1, d);
for(int i = 1; i <= n; i++) {
int x = lower_bound(h + 1, h + 1 + d, a[i]) - h;
f[i] = update(f[i - 1], 1, d, x);
}
while(m--) {
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
int x = query(f[l - 1], f[r], 1, d, k);
printf("%d\n", h[x]);
}
}
return 0;
}
hdu2665(主席树模板题)的更多相关文章
- 【POJ 2104】 K-th Number 主席树模板题
达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...
- 主席树:POJ2104 K-th Number (主席树模板题)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44952 Accepted: 14951 Ca ...
- poj2104 主席树模板题
题意 给出n个数字组成的数字序列,有m组询问.每次询问包含三个数字l,r,k.对于每个询问输出序列区间[l,r]中第k大的数字. 分析 这是主席树的模板题,套板子就可以 #include <cs ...
- 洛谷3834 hdu2665主席树模板,动态查询区间第k小
题目链接:https://www.luogu.com.cn/problem/P3834 对于区间查询第k小的问题,在区间数量达到5e5的时候是难以用朴素数据结构实现的,这时候主席树就应运而生了,主席树 ...
- 【BZOJ 1901】【Zju 2112】 Dynamic Rankings 动态K值 树状数组套主席树模板题
达神题解传送门:http://blog.csdn.net/dad3zz/article/details/50638360 说一下我对这个模板的理解: 看到这个方法很容易不知所措,因为动态K值需要套树状 ...
- SPOJ MKTHNUM & POJ 2104 - K-th Number - [主席树模板题]
题目链接:http://poj.org/problem?id=2104 Description You are working for Macrohard company in data struct ...
- POJ 2104 K-th Number(主席树模板题)
http://poj.org/problem?id=2104 题意:求区间$[l,r]$的第k小. 思路:主席树不好理解啊,简单叙述一下吧. 主席树就是由多棵线段树组成的,对于数组$a[1,2...n ...
- 主席树 模板题 luogu([POI2014]KUR-Couriers)
求区间内是否有个数大于二分之一的数,有的话输出这个数,没有的话输出0. 在询问的时候,如果左边有sum大于这个limit,就可以继续求,如果右边有sum大于limit 也递归, 如果都不行,返回 0 ...
- POJ 2104 主席树模板题
#include <iostream> #include <cstdio> #include <algorithm> int const maxn = 200010 ...
随机推荐
- SRM707 div1 MultiplyAddPuzzle
题目大意:给定4个数,s,t,a,b 每次可以将s加a或者乘b,问最少多少次可以得到t 做法:考虑最后的形式,肯定是s*b^n + a*f(b),f(b)是关于b的多项式 那么b乘多少次实际上是可以知 ...
- Netscaler的超高端口复用助力应对公网地址紧张
Netscaler的超高端口复用助力应对公网地址紧张 http://blog.51cto.com/caojin/1898351 经常会有人问一个IP只有65535(姑且不考虑预留端口),从Big-ip ...
- IIS 发布后无法连接数据库(应用池问题)
查找网站对应的 应用池,修改为 .net4.0 然后设置启动32位应用程序为 True
- react router路由传参
今天,我们要讨论的是react router中Link传值的三种表现形式.分别为通过通配符传参.query传参和state传参. ps:进入正题前,先说明一下,以下的所有内容都是在react-rout ...
- 【CF MEMSQL 3.0 A. Declined Finalists】
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)
P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...
- ansible 批量修改root密码
[root@sz_fy_virt_encrypt_33_239 fetch]# cat /opt/passwd.yml - hosts: web vars: path: /home/opsadmin ...
- linux 服务器下入侵之后的日志清理
1.web日志的清理:access.log 和auth.log 位置在/var/log/下面. 2.系统日志存放在:/root/.bash_history
- [05]Git查看、删除、重命名远程分支和tag
Git查看.删除.重命名远程分支和tag 2015-06-15:加入姊妹篇: 2013-11-06:加入重命名远程分支的内容: 2013-01-09:加入删除远程tag的内容. 姊妹篇:使用Git.G ...
- UVa10288概率
题意: 每张彩票上印有一张图案,要集齐n个不同的图案才能获奖.输入n,求要获奖购买彩票张数的期望(假设获得每个图案的概率相同). 分析: 假设现在已经有k种图案,令s = k/n,得到一个新图案需要t ...