鏈接:http://poj.org/problem?id=2828
題意:車站有n個人在排隊訂票,下面n行代表第n個人,每行pos、val,val表示該人所帶錢,pos表示排在該人前面比該人錢多的人的數量。輸出排隊的序列。
線段樹解之。
#include<stdio.h>
#include<string.h>
struct aa
{
int l,r,len;
}tree[202000*3];
int num[200030];
int val[200030];
int pai[200030];
void buildtree(int le,int ri,int v)
{
int p,q;
tree[v].l=le;
tree[v].r=ri;
tree[v].len=ri-le+1;
if(le>=ri)
return ;
p=(ri+le)/2;
q=v*2;
buildtree(le,p,q);
buildtree(p+1,ri,q+1);
}
int fun(int v,int len)
{
int i,j;
i=v*2;
tree[v].len--;
if(tree[v].l==tree[v].r)
return tree[v].l;
if(tree[i].len>=len)
return fun(i,len);
else
return fun(i+1,len-tree[i].len);
}
int main()
{
int i,j,n,m;
while(scanf("%d",&n)>0) //這裏如果換成while(scanf("%d",&n)>0,n)就會超時,坑爹的tle了n遍原來是這個,n惹的禍
{
for(i=1;i<=n;i++)
scanf("%d%d",&num[i],&val[i]);
buildtree(1,n,1);
for(i=n;i>=1;i--)
pai[fun(1,num[i]+1)]=val[i];
for(i=1;i<=n;i++)
{
if(i!=n)
printf("%d ",pai[i]);
else
printf("%d\n",pai[i]);
}
}
return 0;
}