poj 2104 K-th Number(可持久线段树)
2014-08-22 01:40
337 查看
K-th Number
持久化:/article/5883285.html
结构:http://www.docin.com/p-627462377.html
View Code
持久化:/article/5883285.html
结构:http://www.docin.com/p-627462377.html
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 100010; int n, m, tot; int a , x , xcnt; int T[N*20], ls[N*20], rs[N*20], sum[N*20]; void build(int l, int r ,int &rt) { rt=++tot; sum[rt]=0; if(l==r) return ; int m=(l+r)>>1; build(l, m, ls[rt]); build(m+1,r,rs[rt]); } void update(int last, int p, int l, int r, int &rt) { rt = ++tot; ls[rt]=ls[last], rs[rt]=rs[last], sum[rt]=sum[last]+1; if(l==r) return ; int m = (l+r)>>1; if(p<=m) update(ls[last], p, l, m, ls[rt]); else update(rs[last], p, m+1, r, rs[rt]); } int query(int ss, int tt, int l, int r, int k) { if(l==r) return l; int m = (l+r)>>1; int num = sum[ls[tt]] - sum[ls[ss]]; if(k<=num) return query(ls[ss], ls[tt], l, m, k); else return query(rs[ss], rs[tt], m+1, r, k-num); return 0; } void solve() { tot = 0; for(int i=1; i<=n; i++) { scanf("%d", &a[i]); x[i] = a[i]; } sort(x+1, x+n+1); xcnt = unique(x+1, x+1+n)-x-1; for(int i=1; i<=n; i++) a[i] = lower_bound(x+1, x+n+1, a[i])-x; build(1, xcnt, T[0]); for(int i=1; i<=n; i++) update(T[i-1],a[i],1,xcnt,T[i]); int l, r, k; while(m--) { scanf("%d%d%d", &l, &r, &k); printf("%d\n", x[query(T[l-1],T[r],1,xcnt,k)]); } } int main() { while(scanf("%d%d", &n, &m)>0 ) solve(); return 0; }
View Code
相关文章推荐
- POJ 2104 K-th Number 区间第K大,可持久化线段树
- 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 线段树
- POJ2104 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大)
- POJ-2104-K-th Number(函数式线段树)
- poj 2104 K-th Number(线段树)
- 用线段树求区间第K大(POJ 2104 K-th Number)
- POJ 2104 K-th Number (划分树 函数式线段树)
- [POJ 2104]K-th Number (不带修改的区间k大,函数式线段树)