- Buy Tickets POJ

来源:互联网 发布:jquery查找子元素数组 编辑:程序博客网 时间:2024/04/27 01:27

**题目意思:有n个数,进行n次操作,每次操作有两个数pos, ans。pos的意思是把ans放到第pos 位置的后面,pos后面的数就往后推一位。最后输出每个位置的ans。
**

这个线段树还是挺好的题目。。
也想到了反过来,但是觉得一个一个去找就不可以了,,
所以这个地方就用到了线段树。。

int n;int p[N],val[N];int ans[N],sum[N<<2],tl[N<<2],tr[N<<2];void build(int ll,int rr,int i){    tr[i]=rr;tl[i]=ll;    if(ll==rr){ sum[i]=1;return ; }    build(ll,md,ls),build(md+1,rr,rs);    sum[i]=sum[ls]+sum[rs];}void update(int p,int i){    if(tl[i]==p&&tr[i]==p){ sum[i]=0;return; }    int mid=(tr[i]+tl[i])>>1;    if(p<=mid)update(p,ls);    else update(p,rs);    sum[i]=sum[ls]+sum[rs];}int query(int k,int ll,int rr,int i){    if(tl[i]==tr[i])return tl[i];    if(sum[ls]>=k)return query(k,ll,md,ls);    return query(k-sum[ls],md+1,rr,rs);}int main(){    while(~sf("%d",&n)){        rep(i,1,n)sf("%d%d",&p[i],&val[i]);        build(1,n,1);        for(int i=n;i>=1;--i){            int t=query(p[i]+1,1,n,1);            ans[t]=val[i];            update(t,1);        }        rep(i,1,n)pf("%d%c",ans[i],i==n?'\n':' ');    }}
原创粉丝点击