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
原创粉丝点击