POJ K-th Number


【题解】
数据结构采用线段树。通过将数组的每一段归并排序来建树。将数组排序来实现离散化。
时间复杂度分析:建树的过程就是归并排序,其时间复杂度为O(nlog(n))。查询时:二分查找第k小元素的复杂度为O(log(n)),访问一个节点的复杂度为O(log(n))。因此,查询一次的复杂度为O((logn)^3),总复杂度为O(m(logn)^3)。
空间复杂度:O(n)。
【代码】
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#define MID(x, y) ((x + y) >> 1)
#define lson(x) (x << 1)
#define rson(x) ((x << 1) | 1) using namespace std; const int maxn = ;
const int maxm = ; int a[maxn << ];
vector<int> tree[maxm << ]; void build(int root, int L, int R)
{
if (L == R) {
tree[root].push_back(a[L]);
return;
}
build(lson(root), L, MID(L, R)), build(rson(root), MID(L, R) + , R);
tree[root].resize(R - L + );
merge(tree[lson(root)].begin(), tree[lson(root)].end(), tree[rson(root)].begin(),
tree[rson(root)].end(), tree[root].begin());
} int query(int root, int l, int r, int L, int R, int x)
{
if (r < L || l > R)return ;
if (L <= l && r <= R) {
return upper_bound(tree[root].begin(), tree[root].end(), x) - tree[root].begin();
}
else {
int re1 = , re2 = ;
re1 = query(lson(root), l, MID(l, r), L, R, x);
re2 = query(rson(root), MID(l, r) + , r, L, R, x);
return re1 + re2;
}
} int main()
{
int array_size, quest_n, i = , j, k, l, r, mid, ans;
scanf("%d %d", &array_size, &quest_n);
for (i = ; i <= array_size; i++) scanf("%d", &a[i]);
build(, , array_size);
sort(a + , a + array_size + );
while (quest_n--) {
scanf("%d %d %d", &i, &j, &k);
l = , r = array_size;
mid = , ans = ;
while (l <= r) {
mid = MID(l, r);
if (query(, , array_size, i, j, a[mid]) >= k) {
ans = mid;
r = mid - ;
}
else l = mid + ;
}
printf("%d\n", a[ans]);
}
return ;
}
POJ K-th Number的更多相关文章
- poj 2104 K-th Number 主席树+超级详细解释
poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...
- poj 2104 K-th Number(主席树,详细有用)
poj 2104 K-th Number(主席树) 主席树就是持久化的线段树,添加的时候,每更新了一个节点的线段树都被保存下来了. 查询区间[L,R]操作的时候,只需要用第R棵树减去第L-1棵树就是区 ...
- POJ 2014.K-th Number 区间第k小 (归并树)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 57543 Accepted: 19893 Ca ...
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)
题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...
- POJ 2104 K-th Number (区间第k大)
题意:给定一个序列A,接下来又m个询问,每个询问输出A[L,R]中的第K大.(保证第k大存在) 思路: 我想拿来练习“可持久化线段树”的,搜到这个比较巧的算法也可以解决这个问题,叫“归并树?.大概的思 ...
- POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)
题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...
- [划分树] POJ 2104 K-th Number
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 51732 Accepted: 17722 Ca ...
- SPOJ MKTHNUM & POJ 2104 - K-th Number - [主席树模板题]
题目链接:http://poj.org/problem?id=2104 Description You are working for Macrohard company in data struct ...
随机推荐
- openstack--6--控制节点和计算节点安装配置neutron
Neutron相关介绍 早期的时候是没有neutron,早期所使用的网络的nova-network,经过版本改变才有个neutron. quantum是因为商标和别的公司重名了,又改成的Neutron ...
- ML(4)——逻辑回归
Logistic Regression虽然名字里带“回归”,但是它实际上是一种分类方法,“逻辑”是Logistic的音译,和真正的逻辑没有任何关系. 模型 线性模型 由于逻辑回归是一种分类方法,所以我 ...
- 配置B类内网 和 配置A类内网
首先 A 类网 对应的 子网掩码是255.0.0.0 B 类网 对应的 子网掩码是255.255.0.0 C 类网 对应的 子网掩码是255.255.255.0 一般来说 10 开头的都是 A 类网 ...
- Firedac 数据连接池的应用
procedure TForm2.Button1Click(Sender: TObject); begin if not FDConnection1.Connected then FDConnecti ...
- springboot学习心得
1.mvn package --加载运行一个含有pom.xml的目录并生成target目录2.mvn dependency:tree 显示项目所有依赖的树状结构3.业务委托给了Spring Boot的 ...
- AXI_LITE源码学习笔记
AXI_LITE源码学习笔记 1. axi_awready信号的产生 准备接收写地址信号 // Implement axi_awready generation // axi_awready is a ...
- XE5开发Android程序调用电话相关功能(短信息和电话) [转]
其实都可以通过intent和URI调用系统功能.Windows程序员可以理解成是ShellExecute.这个是万金油.可以有调用各种功能.后面会介绍. 1.短信息.很简单 方法a.不使用Intent ...
- SQLSERVER2008 存储过程基本语法
SQLSERVER2008 存储过程基本语法 来源:https://www.cnblogs.com/tlduck/p/5462399.html 一.定义变量--简单赋值declare @a intse ...
- 修改docker容器的端口映射
大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改.通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射. 有没有办法不保存镜像而直接修改 ...
- 前端js 省市联动
代码下载地址 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...