[luogu3834]静态区间第k小【主席树】
传送门:https://www.luogu.org/problemnew/show/P3834
题目描述
如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值。
分析
很多人都说是用主席树来维护,一开始蒟蒻chh做这道题的时候还以为是分块乱搞,但是发现常数非常的大,就转用主席树了。这道题我们维护的主席树是一个权值线段树,意思就是维护一个桶,那么我们手动模拟主席树的建树过程,可以发现如果我们要查询区间\([l,r]\),那么发现编号为l-1的主席树和编号为r的主席树上对应的链上的差值就是我们区间上有多少个数是这样的。参照二叉搜索树的查找第k大的方法,我们就只需要每一次比较两个链上数值的差值和我们需要k大小,选择路径查询就可以做出来了。
注一句:这道题目因为维护的是权值线段树,那么题目中给出的1e9实在是太大了,那么我们就离散化一下,还是非常简单的。
ac代码
#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define N 200005
using namespace std;
template <typename T>
inline void read(T &x) {
x = 0; T fl = 1;
char ch = 0;
while (ch < '0' || ch > '9') {
if (ch == '-') fl = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
x *= fl;
}
struct Last_segment_tree {
#define mid ((l + r)>> 1)
int tot;
int rt[N];
struct node {
int lc, rc, s;
node() {
lc = rc = s = 0;
}
}tr[N * 35];
Last_segment_tree() {
tot = 0;
}
void build(int &nod, int l, int r) {
nod = ++ tot;
if (l == r) return;
build(tr[nod].lc, l, mid);
build(tr[nod].rc, mid + 1, r);
}
void update(int &nod, int pre, int l, int r, int k) {
nod = ++ tot;
tr[nod] = tr[pre]; tr[nod].s ++;
if (l == r) return;
if (k <= mid) update(tr[nod].lc, tr[pre].lc, l, mid, k);
else update(tr[nod].rc, tr[pre].rc, mid + 1, r, k);
}
int query(int x, int y, int l, int r, int k) {
if (l == r) return l;
int a = tr[tr[y].lc].s - tr[tr[x].lc].s;
if (a >= k) return query(tr[x].lc, tr[y].lc, l, mid, k);
else return query(tr[x].rc, tr[y].rc, mid + 1, r, k - a);
}
int kth(int l, int r, int ql, int qr, int k) {
return query(rt[ql - 1], rt[qr], l, r, k);
}
}lstr;
int n, m;
int a[N], disc[N];
int main() {
read(n); read(m);
for (int i = 1; i <= n; i ++) {
read(a[i]);
disc[i] = a[i];
}
sort(disc + 1, disc + 1 + n);
int d = unique(disc + 1, disc + 1 + n) - disc - 1;
lstr.build(lstr.rt[0], 1, d);
for (int i = 1; i <= n; i ++) {
a[i] = lower_bound(disc + 1, disc + 1 + d, a[i]) - disc;
lstr.update(lstr.rt[i], lstr.rt[i - 1], 1 , d, a[i]);
}
while (m --) {
int x, y, z;
read(x); read(y); read(z);
int p = lstr.kth(1, d, x, y, z);
printf("%d\n", disc[p]);
}
return 0;
}
[luogu3834]静态区间第k小【主席树】的更多相关文章
- Dynamic Rankings || 动态/静态区间第k小(主席树)
JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k ...
- POJ2104 K-th Number —— 静态区间第k小
题目链接:http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Sub ...
- 静态区间第K小(整体二分、主席树)
题目链接 题解 主席树入门题 但是这里给出整体二分解法 整体二分顾名思义是把所有操作放在一起二分 想想,如果求\([1-n]\)的第\(k\)小怎么二分求得? 我们可以二分答案\(k\), \(O(n ...
- 主席树(可持久化线段树)静态区间第K小
传送门主席树 #include <bits/stdc++.h> #define int long long using namespace std; const int maxn=2e5+ ...
- POJ2104&&HDU2665(静态区间第K小)
题目大意 给定一个有N个数字的序列,然后又m个查询,形式如下: l r k 要求你返回区间[l,r]第k小的数是哪个 题解 终于弄懂主席树是个啥东西了,O(∩_∩)O~~,这题正是主席树的裸题,主席树 ...
- 洛谷.3834.[模板]可持久化线段树(主席树 静态区间第k小)
题目链接 //离散化后范围1~cnt不要错 #include<cstdio> #include<cctype> #include<algorithm> //#def ...
- HDU2665 求区间第K大 主席树
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2665 代码: //#include<bits/stdc++.h> #include< ...
- 静态区间第k小 - 整体二分
蒟蒻终于学会整体二分啦! 思路 实现 丑陋无比的代码 #include <bits/stdc++.h> using namespace std; const int N = 200005; ...
- POJ-2104-K-th Number(区间第K大+主席树模板题)
Description You are working for Macrohard company in data structures department. After failing your ...
随机推荐
- Rabbitmq-direct演示
在上一节中我们创建了一个日志系统.实现将日志消息广播给所有的cusumer. 在这片教程中,我们将为日志系统添加一个功能:仅仅订阅一部分消息.比如:我们可以直接将关键的错误类型日志消息保存到日志文件中 ...
- mysql大数据量下的分页
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- Session会话与Cookie简单说明
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- Centos6.8下编译安装LAMP的操作记录梳理
之前用的最多的web框架是LNMP,偶尔也会用到LAMP.接下来简单说下LAMP环境的部署记录,这里选择源码安装的方式: LAMP相关安装包下载地址:https://pan.baidu.com/s/1 ...
- OpenStack构架知识梳理
OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于:帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云 ...
- 牛客国庆集训派对Day6 B.Board
链接 [https://www.nowcoder.com/acm/contest/206/B] 分析 只要在n*n范围内随便找一个斜对角的一个格子去计算就知道了 具体看代码体会吧 代码 #includ ...
- [Beta]M2事后分析
计划 你原计划的工作是否最后都做完了? 如果有没做完的,为什么? 答:没有,全部的功能没有实现.其中,界面还差两个,逻辑还差闹钟逻辑和群组逻辑,可以说这些东西是我们的核心功能之一,缺失了他们对我们整个 ...
- 毕业设计 之 三 mooodle及bigbluebutton使用笔记(未完成)
毕业设计 之 三 mooodle及bigbluebutton使用笔记 作者:20135216 平台:windows10 备注:N把辛酸泪 附:在准备过程中其他的一些零碎小问题 一.关于moodle 1 ...
- Apollo的Oracle适配
Apollo的Oracle适配改动 这几天工作需要使用Apollo配置中心.Apollo唯一的依赖是MySQL数据库,然而公司只有Oracle数据库资源.这里有一个Oracle适配改动的分支,但是 ...
- maven私服 Nexus2.x.x私服安装配置
一.Nexus的下载和安装 1.下载nexus ,下载地址:https://www.sonatype.com/download-oss-sonatype 2.打开目录nexus-2.x.x-xx-b ...