知道了这个解法,让我很兴奋。
好,多余的话不说,上代码。
1 #include <stdio.h> 2 #define lson l,m,rt<<1 3 #define rson m+1,r,rt<<1|1 4 #define maxn 222222 5 int val[maxn],sum[maxn<<2],pos[maxn],res[maxn]; 6 int id; 7 void build(int l,int r,int rt) 8 { 9 sum[rt]=r-l+1; 10 if(l==r) 11 return; 12 int m=(l+r)>>1; 13 build(lson); 14 build(rson); 15 } 16 void update(int p,int l,int r,int rt) 17 { 18 sum[rt]--; 19 if(l==r) 20 { 21 id=l; 22 return; 23 } 24 int m=(l+r)>>1; 25 if(sum[rt<<1]>=p) 26 update(p,lson); 27 else 28 { 29 p-=sum[rt<<1]; 30 update(p,rson); 31 } 32 } 33 int main() 34 { 35 int n; 36 int i; 37 while(~scanf("%d",&n)) 38 { 39 build(1,n,1); 40 for(i=0;i<n;++i) 41 { 42 scanf("%d%d",&pos[i],&val[i]); 43 } 44 for(i=n-1;i>=0;--i) 45 { 46 update(pos[i]+1,1,n,1); 47 res[id]=val[i]; 48 } 49 for(i=1;i<=n;++i) 50 { 51 if(i==1) 52 printf("%d",res[i]); 53 else 54 printf(" %d",res[i]); 55 } 56 printf("\n"); 57 } 58 return 0; 59 }