POJ 2104
来源:互联网 发布:java内存泄露例子 编辑:程序博客网 时间:2024/06/06 00:16
划分树
#include<iostream>#include<cstdio>#include<algorithm>#define MAX 100005using namespace std;class TreeNode{ public: int left; int right; int mid;};int ToLeft[30][MAX];int val[30][MAX];TreeNode node[3*MAX];int sorted[MAX];void BuildTree(int k, int d, int l, int r){ node[k].left = l; node[k].right = r; node[k].mid = (l + r) >> 1; int mid = (l + r) >> 1; if(l == r) return ; int lsame = mid - l + 1; for(int i = l;i <= r; i ++) { if(val[d][i] < sorted[mid]) lsame --; } int lpos = l; int rpos = mid + 1; for(int i = l;i <= r;i ++) { if(i == l) ToLeft[d][i] == 0; else ToLeft[d][i] = ToLeft[d][i-1]; if(val[d][i] < sorted[mid]) { ToLeft[d][i] ++; val[d+1][lpos++] = val[d][i]; } else if(val[d][i] > sorted[mid]) val[d+1][rpos++] = val[d][i]; else { if(lsame) { ToLeft[d][i] ++; val[d+1][lpos++] = val[d][i]; lsame --; } else val[d+1][rpos++] = val[d][i]; } } BuildTree(k << 1, d + 1, l, mid); BuildTree(k << 1|1, d+1, mid + 1, r);}int Query(int l, int r, int k, int d, int idx){ if(l == r) return val[d][l]; int s; int ss; if(node[idx].left == l) { s = ToLeft[d][r]; ss = 0; } else { s = ToLeft[d][r] - ToLeft[d][l-1]; ss = ToLeft[d][l-1]; } if(s >= k) { int newl = node[idx].left + ss; int newr = node[idx].left + ss + s - 1; return Query(newl, newr, k, d + 1, idx << 1); } else { int bb = l - node[idx].left - ss; int b = r- l - s + 1; int newl = node[idx].mid + bb + 1; int newr = node[idx].mid + bb + b; return Query(newl, newr, k - s, d + 1, idx << 1|1); }}int main(int argc, char const *argv[]){ int n, m; int l, r, k; //freopen("in.c", "r", stdin); while(~scanf("%d%d", &n, &m)) { for(int i = 1;i <= n;i ++) { scanf("%d", &val[0][i]); sorted[i] = val[0][i]; } sort(sorted+1, sorted+n+1); BuildTree(1, 0, 1, n); for(int i = 0;i < m;i ++) { scanf("%d%d%d", &l, &r, &k); printf("%d\n", Query(l, r, k, 0, 1)); } } return 0;}
0 0
- POJ 2104
- poj 2104
- poj 2104
- poj 2104
- POJ 2104
- POJ 2104 划分树
- [划分树] poj 2104
- poj 2104 归并树
- poj 2104 划分树
- POJ 2104 划分树
- 划分树 poj 2104
- poj 2104(划分树)
- poj 2104 划分树
- POJ 2104 解题报告
- poj 2104 Drying
- POJ 2104【整体二分】
- POJ 2104 划分树
- poj-2104【构造】
- 简单的API应用
- HDOJ 1698
- POJ 3468
- 线段树求矩形面积并 扫描线+离散化
- POJ 1151
- POJ 2104
- HDU 2665
- 最大流算法---Edmond-Karp
- HDU 3549
- POJ 1273
- Codeforce A. Milking cows
- HDU 4006
- POJ 2823
- HDU 4496