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 ...
随机推荐
- day 56 jQuery学习
1.补充:each 描述:一个通用的迭代函数,它可以用来无缝迭代对象和数组.数组和类似数组的对象通过一个长度属性(如一个函数的参数对象)来迭代数字索引,从0到length - 1.其他对象通过其属性名 ...
- 试用 openresty/lua-resty-shell
openresty/lua-resty-shell 是当前最新rc 版本内置的shell 功能,我们可以用来执行一个脚本,以及命令 还是比较方便的. 测试集成了一个oreilly电子书下载的功能 环境 ...
- sqler sql 转rest api 数据聚合操作
sqler 2.0 提供了一个新的指令aggregate,注意这个和sql 的聚合函数不是一个概念,这个只是为了 方便api数据的拼接 参考格式 databases { exec = &qu ...
- HDU2220 Eddy's AC难题
版权声明:长风原创 https://blog.csdn.net/u012846486/article/details/27853287 Eddy's AC难题 Time Limit: 3000/100 ...
- MySql安装完成后,Navicat连接不上的问题
Navicat连接mysql8.0.1版本出现1251--Client does not support authentication protocol requested by server的解决 ...
- create-react-app 搭建的项目中,让 antd 通过侧边栏导航 Menu 的 Menu.Item 控制 Content 部分的变化
第一种:BrowserRouter把Menu和Route组给一起包起来 <Router></Router> 标签要把Menu和Route组给一起包起来 修改src/index. ...
- LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP
题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...
- SqlServer语句
1.增加列 增加int列,不为空并赋默认值为0 alter table Department add Status int not null default 0 with values 2.新建表:c ...
- linux curl 命令的使用
有时候需要内网访问接口地址,使用curl命令,带上-v参数 -v 参数可以显示一次 http 通信的整个过程,包括端口连接和 http request 头信息 curl -v http://172.9 ...
- CSS:绝对定位布局案例 position布局实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...