POJ2104K-th Number(主席树)
2017-03-20 18:42
225 查看
题意:
求区间第k大的数
主席树模板题:
求区间第k大的数
主席树模板题:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; const int N = 100005; struct Node { int ls, rs, w; Node(){ls = rs = w = 0;} }segTree[N*20]; int a , b , p , root , sz; bool cmp(int i, int j) { return a[i] < a[j]; } void build(int &rt, int l, int r, int x) { segTree[++sz] = segTree[rt]; rt = sz; segTree[rt].w++; if(l == r) return ; int m = (l+r) >> 1; if(x <= m) build(segTree[rt].ls, l, m, x); else build(segTree[rt].rs, m+1, r, x); } int query(int i, int j, int l, int r, int k) { if(l == r) return l; int num = segTree[segTree[j].ls].w - segTree[segTree[i].ls].w; int m = (l+r) >> 1; if(num >= k) return query(segTree[i].ls, segTree[j].ls, l, m, k); else return query(segTree[i].rs, segTree[j].rs, m+1, r, k-num); } int main() { int n, m; while(scanf("%d%d", &n, &m) != EOF) { root[0] = 0; for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); p[i] = i; } sort(p+1, p+n+1, cmp); for(int i = 1; i <= n; i++) b[p[i]] = i; sz = 0; for(int i = 1; i <= n; i++) { root[i] = root[i-1]; build(root[i], 1, n, b[i]); } for(int i = 0; i < m; i++) { int x, y, k; scanf("%d%d%d", &x, &y, &k); int t = query(root[x-1], root[y], 1, n, k); printf("%d\n", a[p[t]]); } } return 0; }
相关文章推荐
- 主席树或线段树-poj2104K-th Number
- poj2104K-th Number (主席树)
- 【POJ】2104 K-th Number 静态第K小——主席树
- POJ2104-- K-th Number(主席树静态区间第k大)
- 【POJ2104】K-th Number 主席树?函数式线段树?可持久化线段树?……反正是其中一个
- POJ 2104 K-th Number(主席树)
- 主席树K-th Number
- POJ 2104 K-th Number 主席树
- [POJ2104]K-th Number 做题笔记 主席树
- POJ2104 K-th Number(主席树)
- poj 2104 K-th Number (划分树入门 或者 主席树入门)
- POJ 2104 K-th Number (主席树)
- POJ 2104 K-th Number(主席树)
- 【POJ 2104/HDU 2665】K-th Number【整体二分/主席树】
- poj 2104 K-th Number (主席树模板)
- HDU 2104 K-th Number 【主席树】
- POJ2104 K-th Number(划分树和主席树代码)
- POJ 2104 K-th Number (划分树,主席树写过了,这次是整体二分解法 )
- poj2104 K-th Number (主席树入门题|模板题)
- 主席树 poj 2104 K-th Number