【题解】

数据结构采用线段树。通过将数组的每一段归并排序来建树。将数组排序来实现离散化。

时间复杂度分析:建树的过程就是归并排序,其时间复杂度为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的更多相关文章

  1. poj 2104 K-th Number 主席树+超级详细解释

    poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...

  2. poj 2104 K-th Number(主席树,详细有用)

    poj 2104 K-th Number(主席树) 主席树就是持久化的线段树,添加的时候,每更新了一个节点的线段树都被保存下来了. 查询区间[L,R]操作的时候,只需要用第R棵树减去第L-1棵树就是区 ...

  3. POJ 2014.K-th Number 区间第k小 (归并树)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 57543   Accepted: 19893 Ca ...

  4. POJ 2104 K-th Number 主席树(区间第k大)

    题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...

  5. 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 ...

  6. POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)

    题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...

  7. POJ 2104 K-th Number (区间第k大)

    题意:给定一个序列A,接下来又m个询问,每个询问输出A[L,R]中的第K大.(保证第k大存在) 思路: 我想拿来练习“可持久化线段树”的,搜到这个比较巧的算法也可以解决这个问题,叫“归并树?.大概的思 ...

  8. POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)

    题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...

  9. [划分树] POJ 2104 K-th Number

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 51732   Accepted: 17722 Ca ...

  10. SPOJ MKTHNUM & POJ 2104 - K-th Number - [主席树模板题]

    题目链接:http://poj.org/problem?id=2104 Description You are working for Macrohard company in data struct ...

随机推荐

  1. Terraform Detecting Drift

    转自:https://www.terraform.io/docs/extend/best-practices/detecting-drift.html 这篇文章主要说明了对于资源如何处理 read&a ...

  2. 几个方便的nodejs 任务调度框架

    摘录几个方便的nodejs 任务调度包 node-cron https://github.com/kelektiv/node-cron node-schedule https://github.com ...

  3. C#窗体模拟键盘按键(组合键)产生事件 ---- 通过keybd_event()函数

    如何模拟键盘按键触发产生的事件,比如模拟按下Alt + F4 关闭当前程序,Ctrl+Shift 切换输入法等 可以通过win32api 键盘事件 keybd_event() 来实现 1.定义键盘按键 ...

  4. Day 37 视图、存储过程、触发器、函数、事物、锁

    一 .存储过程 1 create view stu_view as select * from ren 视图:是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据 视图有 ...

  5. 【转存】Vue组件选项props

    原帖地址 前面的话 组件接受的选项大部分与Vue实例一样,而选项props是组件中非常重要的一个选项.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过  ...

  6. TypeScript 之 NPM包的类型

    https://m.runoob.com/manual/gitbook/TypeScript/_book/doc/handbook/Typings%20for%20NPM%20Packages.htm ...

  7. ik_max_word ik_smart 区别 和 单字 查询 不到问题

    ik_smart:分词的时候只分一次,句子里面的每个字只会出现一次. 比如:中华人民共和国国歌 入上图,分成:中华人民共和国 国歌 2 部分.每个字都自出现了一次.(我指的每一个位置 的子. 2个国 ...

  8. CenterOS下安装Nginx

    1. 安装gcc 检查版本命令  gcc -v 安装命令 yum install gcc-c++ 2. 安装pcre 命令 yum install prce-devel 3. 安装zlib 命令 yu ...

  9. 关于IP核中中断信号的使用---以zynq系统为例

    关于IP核中中断信号的使用---以zynq系统为例 1.使能设备的中断输出信号 2.使能处理器的中断接收信号 3.连接IP核到处理器之间的中断 此处只是硬件的搭建,软件系统的编写需要进一步研究. 搭建 ...

  10. Vivado约束文件(XDC)的探究(1)

    Vivado约束文件(XDC)的探究(1) 工程建好之后会出现xdc文件: 注意:active 和 target 生成的约束文件如下: