题意:有n个人,每个人有一个pos,val,pos值代表在这个人后面插入val值。
思路:同lost cow一样,从后往前枚举,则前面的数对后面没有影响,可以用树状数组加二分或者线段树。
代码
#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e5+5;
int n,now,pos[N],val[N],ans[N];
struct node{
int l,r;
int lazy;
}tr[N<<2];
void pushup(int u){
tr[u].lazy=tr[u<<1].lazy+tr[u<<1|1].lazy;
}
void bt(int u,int l,int r){
if(l==r){
tr[u]={l,l,1};
return ;
}
tr[u].l=l;
tr[u].r=r;
int mid=l+r>>1;
bt(u<<1,l,mid);
bt(u<<1|1,mid+1,r);
pushup(u);
}
void update(int u,int pos){
if(tr[u].l==tr[u].r){
tr[u].lazy--;
now=tr[u].l;
return ;
}
if(tr[u<<1].lazy>=pos)update(u<<1,pos);
else update(u<<1|1,pos-tr[u<<1].lazy);
pushup(u);
}
int main(){
while(scanf("%d",&n)!=EOF){
bt(1,1,n);
for(int i=1;i<=n;i++){
scanf("%d%d",&pos[i],&val[i]);
}
for(int i=n;i>=1;i--){
update(1,pos[i]+1);
ans[now]=val[i];
}
for(int i=1;i<=n;i++)printf("%d ",ans[i]);
printf("\n");
}
return 0;
}