主席树(区间第k小的数)
题目链接: https://www.luogu.org/problem/P3834
首先要离散化,然后主席树模板。
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 #define mid (l+r)/2
5 using namespace std;
6
7 const int N = 200010;
8 int n, q, m, cnt = 0;
9 int a[N], b[N], T[N];
10 int sum[N<<5], L[N<<5], R[N<<5];
11
12 inline int build(int l, int r)
13 {
14 int rt = ++ cnt;
15 sum[rt] = 0;
16 if (l < r){
17 L[rt] = build(l, mid);
18 R[rt] = build(mid+1, r);
19 }
20 return rt;
21 }
22
23 inline int update(int pre, int l, int r, int x)
24 {
25 int rt = ++ cnt;
26 L[rt] = L[pre]; R[rt] = R[pre]; sum[rt] = sum[pre]+1;
27 if (l < r){
28 if (x <= mid) L[rt] = update(L[pre], l, mid, x);
29 else R[rt] = update(R[pre], mid+1, r, x);
30 }
31 return rt;
32 }
33
34 inline int query(int u, int v, int l, int r, int k)
35 {
36 if (l >= r) return l;
37 int x = sum[L[v]] - sum[L[u]];
38 if (x >= k) return query(L[u], L[v], l, mid, k);
39 else return query(R[u], R[v], mid+1, r, k-x);
40 }
41
42 int main()
43 {
44 scanf("%d%d", &n, &q);
45 for (int i = 1; i <= n; i ++){
46 scanf("%d", &a[i]);
47 b[i] = a[i];
48 }
49 sort(b+1, b+1+n);
50 m = unique(b+1, b+1+n)-b-1;
51 T[0] = build(1, m);
52 for (int i = 1; i <= n; i ++){
53 int t = lower_bound(b+1, b+1+m, a[i])-b;
54 T[i] = update(T[i-1], 1, m, t);
55 }
56 while (q --){
57 int x, y, z;
58 scanf("%d%d%d", &x, &y, &z);
59 int t = query(T[x-1], T[y], 1, m, z);
60 printf("%d\n", b[t]);
61 }
62 return 0;
63 }
主席树(区间第k小的数)的更多相关文章
- 牛客多校第九场H Cutting Bamboos(主席树 区间比k小的个数)题解
题意: 标记为\(1-n\)的竹子,\(q\)个询问,每次给出\(l,r,x,y\).要求为砍区间\(l,r\)的柱子,要求砍\(y\)次把所有竹子砍完,每次砍的时候选一个高度,把比他高的都砍下来,并 ...
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- 主席树区间第K大
主席树的实质其实还是一颗线段树, 然后每一次修改都通过上一次的线段树,来添加新边,使得每次改变就改变logn个节点,很多节点重复利用,达到节省空间的目的. 1.不带修改的区间第K大. HDU-2665 ...
- codeforces 1262D Optimal Subsequences 主席树询问第k小
题意 给定长度为\(n\)的序列\(a\),以及m个询问\(<k,pos>\),每次询问满足下列条件的子序列中第\(pos\)位的值为多少. 子序列长度为\(k\) 序列和是所有长度为\( ...
- HDU 6278 主席树(区间第k大)+二分
Just h-index Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)To ...
- 【XSY2720】区间第k小 整体二分 可持久化线段树
题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...
- HDU 5919 Sequence II(主席树+区间不同数个数+区间第k小)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5919 题意:给出一串序列,每次给出区间,求出该区间内不同数的个数k和第一个数出现的位置(将这些位置组 ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- 主席树总结(经典区间第k小问题)(主席树,线段树)
接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...
随机推荐
- css系列,选择器权重计算方式
CSS选择器分基本选择器(元素选择器,类选择器,通配符选择器,ID选择器,关系选择器), 属性选择器,伪类选择器,伪元素选择器,以及一些特殊选择器,如has,not等. 在CSS中,权重决定了哪些CS ...
- 【leetcode】563. Binary Tree Tilt
Given the root of a binary tree, return the sum of every tree node's tilt. The tilt of a tree node i ...
- VIM多标签页
:tabnew 增加一个标签 :tabc 关闭当前的tab :tabo 关闭所有其他的tab :tabp 或gT 前一个 :tabn 或gt 后一个 :tabs 显示 ...
- 关于java构造器
关于java的构造器.首先构造器并不会创建java对象,构造器知识负责执行初始化,在构造器执行之前,Java对象所需要的内存空间是由new关键字申请出来的.大部分时候,程序使用new关键字为一个Jav ...
- Unity——WegGL打包问题
Rendering设置 Gamma和Linear颜色空间,两者有色差,Gamma有个2.25左右的修正值: WebGL2.0可用的情况,只支持Deferred Render延迟渲染,且只支持Linea ...
- collection库更新1.4.0版本
collection库更新1.4.0版本 collection库一直在使用中,周末集合github上的反馈以及contributor的修改,更新了1.4.0版本. 这个版本做了几个事情: 增加了三种类 ...
- pipeline 结构设计
目录 一.pipeline步骤 二.案例 pipeline详解 只生成一次制品 不同环境部署 系统集成测试 指定版本部署 一.pipeline步骤 当团队开始设计第一个pipeline时,该如何下手呢 ...
- thinkPHP的多语言支持如何配置和部署
框架底层语言包位于:ThinkPHP/Lang/zh-cn.php 可以参考如何编写语言文件 第一步:项目目录下的配置文件中配置多语言支持的相关选项 以我的路径为例是Application\Commo ...
- RabbitMQ,RocketMQ,Kafka 消息模型对比分析
消息模型 消息队列的演进 消息队列模型 发布订阅模型 RabbitMQ的消息模型 交换器的类型 direct topic fanout headers Kafka的消息模型 RocketMQ的消息模型 ...
- java 图形化小工具Abstract Window Toolit
老掉牙的历史 Java1.0在发布的时候,就为我们提供了GUI操作的库,这个库系统在所有的平台下都可以运行,这套基本的类库被称作抽象窗口工具集(Abstract Window Toolit),简称 ...