链接:点击打开链接
题意:就是后面人插队的问题,具体如图所示
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int node[200000*3],ans[200000];
int x[200000],y[200000];
void build(int pos,int l,int r,int id,int x){
int mid;
if(l==r){
node[pos]=1; //初始时最下空格都为1
return;
}
mid=(l+r)/2;
if(id<=mid)
build(2*pos,l,mid,id,x);
else
build(2*pos+1,mid+1,r,id,x);
node[pos]=node[2*pos]+node[2*pos+1]; //更新区间中空格数
}
void question(int pos,int l,int r,int num,int x){
int mid;
if(l==r){
ans[l]=x;node[pos]=0; //放入一个数,空格数就清零
return;
}
mid=(l+r)/2;
if(num<=node[2*pos])
question(2*pos,l,mid,num,x);
else
question(2*pos+1,mid+1,r,num-node[2*pos],x);
node[pos]=node[2*pos]+node[2*pos+1]; //向上更新
}
int main(){
int i,n;
while(scanf("%d",&n)!=EOF){
memset(ans,0,sizeof(ans));
for(i=1;i<=n;i++){
scanf("%d%d",&x[i],&y[i]);
build(1,1,n,i,y[i]);
}
for(i=n;i>=1;i--) //因为后面的数决定了前面
question(1,1,n,x[i]+1,y[i]); //的数的位置,所以从后面更新
for(i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");
}
return 0;
}