ZOJ 3635 线段树

来源:互联网 发布:淘宝优酷会员领取 编辑:程序博客网 时间:2024/05/04 11:55

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3635

题意:每个人有张票,上面的数字代表他坐在从左往右第几个空座上。。

思路:线段树记录空座数目,水线段树。。

#include <cstdio>#define lson l , m , rt << 1#define rson m + 1 , r , rt << 1 | 1const int maxn = 55555;int sum[maxn<<2];int ans[maxn];void PushUP(int rt) {    sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void build(int l,int r,int rt) {   if (l == r) {       sum[rt] = 1;       return ;   }   int m = (l + r) >> 1;   build(lson);   build(rson);   PushUP(rt);}void update(int p,int add,int l,int r,int rt,int now) {       if (l == r) {              sum[rt] += add;              ans[now] = l;              return ;       }       int m = (l + r) >> 1;       if (sum[rt<<1]>=p) update(p , add , lson,now);       else update(p-sum[rt<<1] , add , rson,now);       PushUP(rt);}int main() {    int n;    while(~scanf("%d",&n)){        build(1,n,1);        for(int i=1;i<=n;i++){            int a;            scanf("%d",&a);            update(a,-1,1,n,1,i);        }        int m;        scanf("%d",&m);        while(m--){            int a;            scanf("%d",&a);            printf("%d",ans[a]);            if(m)printf(" ");            else printf("\n");        }    }    return 0;}


0 0