题解:
不错的题
倒序处理,空格的个数就是要插入的位置。数状数组+二分查找O(nlogn*logn)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=201000;
int tree[maxn];
int n;
int pos[maxn],val[maxn];
int ans[maxn];
inline int lowbit(int x)
{
return x&(-x);
}
void add(int pos,int c)
{
for(int i=pos;i<=n;i+=lowbit(i))
tree[i]+=c;
}
int getsum(int pos)
{
int sum=0;
for(int i=pos;i>0;i-=lowbit(i))
sum+=tree[i];
return sum;
}
int bin_find(int l,int r,int x)
{
while(l<r)
{
int mid=(l+r)>>1;
int temp=getsum(mid);
if(temp<x)l=mid+1;
else
r=mid;
}
return l;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++)
{
add(i,1);
scanf("%d%d",&pos[i],&val[i]);
}
for(int i=n;i>=1;i--)
{
int x=bin_find(1,n,pos[i]+1);
ans[x]=val[i];
add(x,-1);
}
for(int i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
return 0;
}