题目描述
达达在买回家的火车票,因为正值春运,售票处排起了长队。
因为晚上室内光线很暗,所以很多人趁机插队。
现在给每个人赋予一个整数作为编号,告诉你每一个排队的人的编号,和他进入队列时的具体位置。
请你确定最终的队列顺序。
题解
这道题与Lost Cows是极其相似的(几乎一模一样)
只是需要拿结构体存一下,最后我们按照身高排序进行输出即可
code
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int c[N],n,m;
int ask(int x)
{
int ans=0;
for(;x;x-=x&-x) ans+=c[x];
return ans;
}
void change(int x,int y)
{
for(;x<=n;x+=x&-x) c[x]+=y;
}
struct node
{
int pos,val,ans;
}a[N];
bool cmp(node x,node y)
{
return x.ans<y.ans;
}
int main()
{
while(~scanf("%d",&n))
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].pos,&a[i].val);
change(i,1);
}
for(int i=n;i>=1;i--)
{
int l=1,r=n,Ans;
while(l<=r)
{
int mid=(l+r)>>1;
if(ask(mid)<a[i].pos+1) l=mid+1;
else r=mid-1,Ans=mid;
}
a[i].ans=Ans;
change(Ans,-1);
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) printf("%d ",a[i].val);
puts("");
}
return 0;
}