标签:
链接:点击打开链接
题意:就是后面人插队的问题,具体如图所示
代码:
#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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/stay_accept/article/details/47356129