POJ-2104 K-th Number(线段树[归并树]-区间第k大)
来源:互联网 发布:阿里云数据分析 编辑:程序博客网 时间:2024/05/22 06:57
题目链接:
题目大意:
数据范围:
解题思路:
代码:
#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <queue>#include <set>#include <map>#include <stack>#include <vector>using namespace std;typedef long long LL;const int inf = 1 << 30;const LL INF = 1LL << 60;const int MaxN = 100010;int n, m;int a[MaxN + 5];vector <int> tree[4 * MaxN + 5];void Build(int rt, int l, int r) { if(l == r) { tree[rt].push_back(a[l]); return; } int mid = (l + r) >> 1; Build(rt << 1, l, mid); Build(rt << 1 | 1, mid + 1, r); //分配(r - l + 1)个元素所需的空间 tree[rt].resize(r - l + 1); //用STL的merge函数将左右儿子的数列合并 merge(tree[rt << 1].begin(), tree[rt << 1].end(), tree[rt << 1 | 1].begin(), tree[rt << 1 | 1].end(), tree[rt].begin());}//计算区间[L, R]中不超过x的个数int query(int rt, int l, int r, int L, int R, int x) { if(r < L || l > R) return 0; else if(L <= l && r <= R) { //二分当前节点的数列中有多少个不超过x的个数 return upper_bound(tree[rt].begin(), tree[rt].end(), x) - tree[rt].begin() ; } else { //递归左右儿子 int mid = (l + r) >> 1; int lc = query(rt << 1, l, mid, L, R, x); int rc = query(rt << 1 | 1, mid + 1, r, L, R, x); return lc + rc; }}int main() { while(scanf("%d %d", &n, &m) != EOF) { for(int i = 1; i <= n; i++) scanf("%d", &a[i]); Build(1, 1, n); sort(a + 1, a + n + 1); for(int i = 1; i <= m; i++) { int L, R, k; //求区间[L, R]中的第k个数 scanf("%d %d %d", &L, &R, &k); int l = 1, r = n; int mid = 0, res = 0; while(l <= r) { mid = (l + r) >> 1; int ans = query(1, 1, n, L, R, a[mid]); if(ans >= k) res = mid, r = mid - 1; else l = mid + 1; } printf("%d\n", a[res]); } } return 0;}
阅读全文
0 0
- POJ-2104 K-th Number(线段树[归并树]-区间第k大)
- POJ 2104 K-th Number 区间第K大,可持久化线段树
- 用线段树求区间第K大(POJ 2104 K-th Number)
- POJ 2104 K-th Number(区间第k大数)(平方分割,归并树,划分树)
- poj 2104 K-th Number 区间第K大 二分 离散化 + (莫队 树状数组/平方分解/线段树)
- [POJ 2104]K-th Number (不带修改的区间k大,函数式线段树)
- POJ 2104(K-th Number-区间第k大-主席树)
- POJ 2104(K-th Number-区间第k大-主席树)
- POJ 2104 K-th Number 主席树 静态区间第K大
- 【POJ 2104】(K-th Number-区间第k大-主席树)
- POJ 2104 K-th Number (主席树 静态区间第K大)
- poj 2104 K-th Number (静态区间第k大,主席树)
- [poj 2104 K-th Number] 主席树 区间第K大
- POJ 2104 K-th Number 静态区间第k大 主席树
- POJ 2104 K-th Number 主席树(求区间第k大)
- 【主席树 求区间第k大】poj 2104 K-th Number
- POJ-2104 K-th Number (主席树 不带修改区间第k大)
- POJ 2104K-th Number(可持久化线段树-求第K大)
- JAVA Freemarker(7)--macro、nested与function
- TeamViewer 无法连接上伙伴
- maven常用命令介绍
- 剑指offer之十三---链表中倒数第k个结点
- 数据库系统
- POJ-2104 K-th Number(线段树[归并树]-区间第k大)
- 20170928_二叉树的一些基本概念
- OWB的ETL工具教程
- 二叉树的镜像
- css 清除浮动
- LinuxStudyNote(33)-Linux常用命令(8)-mount挂载命令、umount卸载命令
- angular4 服务依赖注入的三种方法
- linux常用操作命令及linux系统目录结构
- [agc015e]Mr.Aoki Incubator