zoj3635 Cinema in Akiba

来源:互联网 发布:linux guanji 编辑:程序博客网 时间:2024/05/16 14:38
一开始就想到应该是要用树状数组或线段树,但用树状数组尝试无果,然后就转向用线段树,感觉跟湘潭市赛的那道约瑟夫问题挺像,然后一敲果然就ok了。代码挺简单不多说。
#include<stdio.h>#define MAX 50005#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int i,n,sum[MAX<<2],num[MAX],res[MAX];void build(int l,int r, int rt)      {    sum[rt]=r-l+1;         //因为sum[rt]能轻易直接得到,所以就省去pushup了    if(l==r)return;    int m=(l+r)>>1;    build(lson);    build(rson);}int update(int v,int l,int r,int rt){    sum[rt]--;    if(l==r)return l;    int m=(l+r)>>1;    if(v<=sum[rt<<1])    return update(v,lson);    else    return update(v-sum[rt<<1],rson);}int main(){while(scanf("%d",&n)!=EOF){int m,q,ans,s;build(1,n,1);for(i=0;i<n;i++){scanf("%d",&num[i]);res[i]=update(num[i],1,n,1);}scanf("%d",&m);scanf("%d",&q);printf("%d",res[q-1]);for(i=1;i<m;i++){scanf("%d",&q);printf(" %d",res[q-1]);}printf("\n");}return 0;}