poj2104 K大数 划分树
2013-06-28 18:36
337 查看
题意:给定一个数列,求一个区间的第K大数
模板题, 其中的newl, newr 有点不明白.
View Code
模板题, 其中的newl, newr 有点不明白.
#include <iostream> #include <algorithm> using namespace std; const int M = 100005; int toLeft[20][M], tree[20][M], sorted[M]; void build(int level, int left, int right) { if (left == right) return; int i, mid = (left + right) >>1; int suppose = mid - left + 1; for (i=left; i<=right; i++) if (tree[level][i] < sorted[mid]) suppose--; int lpos = left, rpos = mid+1; for (i=left; i<=right; i++) { if (i == left) toLeft[level][i] = 0; else toLeft[level][i] = toLeft[level][i-1]; if (tree[level][i] < sorted[mid]) { toLeft[level][i]++; tree[level+1][lpos++] = tree[level][i]; } else if (tree[level][i] > sorted[mid]) { tree[level+1][rpos++] = tree[level][i]; } else { if (suppose != 0) { suppose--; toLeft[level][i]++; tree[level+1][lpos++] = tree[level][i]; } else tree[level+1][rpos++] = tree[level][i]; } } build(level+1, left, mid); build(level+1, mid+1, right); } int query(int level, int left, int right, int qleft, int qright, int k) { if (qleft == qright) return tree[level][qright]; int s, ss, mid = (left + right)>>1; if (left == qleft) { s = 0; ss = toLeft[level][qright]; } else { s = toLeft[level][qleft-1]; ss = toLeft[level][qright] - s; } int newl, newr; if (k <= ss) { newl = left + s; newr = left + s + ss -1; return query(level+1, left, mid, newl, newr, k); } else { newl = mid-left+1+qleft-s; newr = mid-left+1+qright-s-ss; return query(level+1, mid+1, right, newl, newr, k-ss); } } int main() { int n, m; int i; while (scanf("%d%d", &n, &m) == 2) { for (i=1; i<=n; i++) { scanf("%d", &tree[0][i]); sorted[i] = tree[0][i]; } sort(sorted+1, sorted+n+1); build(0,1,n); int ql, qr, k; for (i=0; i<m; i++) { scanf("%d%d%d", &ql, &qr, &k); printf("%d\n", query(0, 1, n, ql, qr, k)); } } return 0; }
View Code
相关文章推荐
- poj 2104 && 2761 Feed the dogs(划分树)
- poj2104||hdu2665 归并树|划分树
- POJ 2104 K-th Number(划分树)
- 【转】POJ-2104(K-th Number 划分树)
- POJ 2104 K-th Number(划分树)
- POJ2104 K-th Number (子区间内第k大的数字)【划分树算法模板应用】
- hdu 2665 Kth number (poj 2104 K-th Number) 划分树
- poj2104(划分树)
- 区间第K大数——划分树(POJ2104解题报告)
- POJ 2104 K-th Number (划分树)
- hdu 4417,poj 2104 划分树(模版)归并树(模版)
- poj 2104 K-th Number - 经典划分树
- POJ 2104 划分树模板题
- 【原】 POJ 2104 K-th Number 线段树 划分树 合并树 解题报告
- POJ 2104 & HDU 2665 K-th Number (划分树)
- POJ 2104-K-th Number(划分树)求区间内第k小的数
- K-th Number (POJ_2104) 划分树
- poj 2104 划分树(查询区间第k大数)
- poj 2104 K-th Number(划分树)
- poj 2104 and hdu 2665 划分树模板入门题