poj 2104K-th Number(划分树)
来源:互联网 发布:php网站源码与asp.net 编辑:程序博客网 时间:2024/05/21 17:59
题目链接http://begin.lydsy.com/JudgeOnline/problem.php?id=2879:http://poj.org/problem?id=2104
(一个模版题吧...)
参考网上的代码照着敲了一遍差不多就理解了...
附上代码:
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<cstdlib>#include<cstring>#include<string>#include<queue>#include<algorithm>#include<vector>#include<map>using namespace std;typedef long long ll;const int INF=0x3f3f3f3f;const int maxn=1e5+10;int T,n,q;int tree[22][maxn];int toleft[22][maxn];int as[maxn];void build(int l, int r, int dep){ if (l == r) return; int mid = (l + r) >> 1; int same = mid - l + 1; for (int i = l; i <= r; i++){ if (tree[dep][i] < as[mid]){ same--; } } int ls = l; int rs = mid + 1; for (int i = l; i <= r; i++){ if (tree[dep][i] < as[mid]) tree[dep + 1][ls++] = tree[dep][i]; else if (tree[dep][i] == as[mid] && same) tree[dep + 1][ls++] = tree[dep][i], same--; else tree[dep + 1][rs++] = tree[dep][i]; toleft[dep][i] = toleft[dep][l - 1] + ls - l; } build(l, mid, dep + 1); build(mid + 1, r, dep + 1);}int query(int left, int right, int k, int L, int R, int dep){ if (left == right) return tree[dep][left]; int mid = (L + R) >> 1; int x = toleft[dep][left - 1] - toleft[dep][L - 1]; int y = toleft[dep][right] - toleft[dep][L - 1]; int rx = left - 1 - L + 1 - x; int ry = right - L + 1 - y; int cnt = y - x; if (cnt >= k) return query(L + x, L + y - 1, k, L, mid, dep + 1); else return query(mid + 1 + rx,mid + 1 + ry - 1, k - cnt, mid + 1, R, dep + 1);}int main(){#ifndef ONLINE_JUDGEfreopen("test.in","r",stdin);freopen("test.out","w",stdout);#endif while (cin >> n >> q){ for (int i = 1; i <= n; i++){ scanf("%d", as + i); tree[0][i] = as[i]; } sort(as + 1, as + n + 1); build(1, n, 0); int li, ri, ki; for (int i = 0; i < q; i++){ scanf("%d%d%d", &li, &ri, &ki); printf("%d\n", query(li, ri, ki, 1, n, 0)); } } return 0;}
0 0
- POJ 2104 K-th Number 划分树
- poj 2104 K-th Number--划分树
- poj 2104 K-th Number(划分树)
- POJ 2104 K-th Number 划分树
- [POJ 2104] K-th Number [划分树]
- poj 2104 K-th Number(划分树)
- POJ 2104 K-th Number 划分树
- POJ 2104 K-th Number 划分树
- K-th Number - POJ 2104 划分树
- POJ 2104 K-th Number【划分树】
- POJ 2104 K-th Number (划分树)
- POJ 2104K-th Number 划分树
- poj 2104K-th Number(划分树)
- POJ 2104 K-th Number 划分树
- poj 2104 K-th Number(划分树)
- POJ 2104 K-th Number 归并树与划分树
- poj 2104 K-th Number(划分树 or 主席树)
- POJ 2104 K-th Number (主席树 || 划分树)
- 0141 rtmplib rtmp协议过程分析
- 八成Java开发者解答不了的问题
- C# winform 中MessageBox用法大全(附效果图)
- 浅谈Activity
- UVA 11461 K - Square Numbers
- poj 2104K-th Number(划分树)
- 关于Spring的69个面试问答——终极列表
- POJ-3717-Facer's Chocolate Dream
- strcat()和strncat()函数的实现
- 并非所有的代码路径都返回值 是怎么原因?
- ROS 源码分析中一
- CountDownTimer,倒计时
- Android中文件的读写操作
- 在什么情况下Java比C++快?