博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构 - 主席树
阅读量:4630 次
发布时间:2019-06-09

本文共 1851 字,大约阅读时间需要 6 分钟。

查询 $[l,r]$ 区间第 $k$ 小的值。

#include 
#include
#include
using namespace std;const int maxn = 1e5; //数据范围int tot, n, m;int sum[(maxn << 5) + 10], rt[maxn + 10], ls[(maxn << 5) + 10], rs[(maxn << 5) + 10];int a[maxn + 10], ind[maxn + 10], len;inline int getid(const int &val) { //离散化 return lower_bound(ind + 1, ind + len + 1, val) - ind;}int build(int l, int r) { //建树 int root = ++tot; if (l == r) return root; int mid = l + r >> 1; ls[root] = build(l, mid); rs[root] = build(mid + 1, r); return root; //返回该子树的根节点}int update(int k, int l, int r, int root) { //插入操作 int dir = ++tot; ls[dir] = ls[root], rs[dir] = rs[root], sum[dir] = sum[root] + 1; if (l == r) return dir; int mid = l + r >> 1; if (k <= mid) ls[dir] = update(k, l, mid, ls[dir]); else rs[dir] = update(k, mid + 1, r, rs[dir]); return dir;}int query(int u, int v, int l, int r, int k) { //查询操作 int mid = l + r >> 1, x = sum[ls[v]] - sum[ls[u]]; //通过区间减法得到左儿子的信息 if (l == r) return l; if (k <= x) //说明在左儿子中 return query(ls[u], ls[v], l, mid, k); else //说明在右儿子中 return query(rs[u], rs[v], mid + 1, r, k - x);}inline void init() { scanf("%d%d", &n, &m); for (register int i = 1; i <= n; ++i) scanf("%d", a + i); memcpy(ind, a, sizeof ind); sort(ind + 1, ind + n + 1); len = unique(ind + 1, ind + n + 1) - ind - 1; rt[0] = build(1, len); for (register int i = 1; i <= n; ++i) rt[i] = update(getid(a[i]), 1, len, rt[i - 1]);}int l, r, k;inline void work() { while (m--) { scanf("%d%d%d", &l, &r, &k); printf("%d\n", ind[query(rt[l - 1], rt[r], 1, len, k)]); //回答询问 }}int main() { init(); work(); return 0;}

 

转载于:https://www.cnblogs.com/Yinku/p/10472880.html

你可能感兴趣的文章
Flink学习笔记:Operators之CoGroup及Join操作
查看>>
[WCF] - Odata Service 访问失败,查看具体错误信息的方法
查看>>
【2019/4/30】周进度报告
查看>>
.net程序员面试题
查看>>
团队分数分配方法——BY 李栋
查看>>
docker获取镜像很慢解决办法
查看>>
学习-现代交换原理与通信技术
查看>>
【编程题目】左旋转字符串 ☆
查看>>
SQL Server 2008 R2如何开启数据库的远程连接
查看>>
笔记一:python安装和执行
查看>>
关于字符串的分割问题
查看>>
Tornado 类与类组合降低耦合
查看>>
2009 Competition Highlights by ICPC Live
查看>>
ssh远程操作服务器
查看>>
树莓派Android Things物联网开发:创建一个Things项目
查看>>
GIT使用方法
查看>>
第三阶段 10_JavaWeb基础_
查看>>
裁员浪潮,互联网人该何去何从?
查看>>
Python Day 01
查看>>
Android5.0之CoordinatorLayout的使用
查看>>