http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=4791

(1)第一次写浙大的题目,这题让我十分意外,基本的线段树类型(求第x个空位)。

(2)电影院里,一次插入一个人,让他坐在第x个空位shang (每个x均给定)。求最终的位置安排(制定一些人,求他们各自的座号)。

具体代码:

View Code
#include<stdio.h>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn=51000;
int n, m;
int pos[maxn], sum[maxn<<2];
void pushup(int rt)
{
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l, int r, int rt)
{
    sum[rt]=r-l+1;
    if(l==r)
    {
        return ;
    }
    int m=l+r>>1;
    build(lson);
    build(rson);
}
void insert(int p, int i, int l, int r, int rt)
{
    if(l==r)
    {
        sum[rt]=0;
        pos[i]=l;
        return ;
    }
    int m=l+r>>1;
    if(p<=sum[rt<<1]) insert(p, i, lson);
    else insert(p-sum[rt<<1], i, rson);
    pushup(rt);
}
int main()
{
    while(scanf("%d", &n)!=EOF)
    {
        build(1, n, 1);
        for(int i=1;i<=n;i++)
        {
            int p;
            scanf("%d", &p);
            insert(p, i, 1, n, 1);
        }
        scanf("%d", &m);
        for(int i=1;i<=m;i++)
        {
            int x;
            scanf("%d", &x);
            if(i!=1) printf(" %d", pos[x]);
            else printf("%d", pos[x]);
        }
        printf("\n");
    }
    return 0;
}