poj 2828

#include <iostream>
#include <fstream>
#include <algorithm>

#define MAXN 200200
using namespace std;

struct seg_tre{
    int l,r;
     int cnt;
}Node[3*MAXN];

struct person{
     int pos,val;
}P[MAXN];

int N,i;
int ans[MAXN];

int Mid(int step){
   return (Node[step].l+Node[step].r)/2;
}

void Build(int step,int l,int r){
    Node[step].l=l;
    Node[step].r=r;
    Node[step].cnt=r-l+1;
    if(l==r)  return;
    Build(2*step,l,Mid(step));
    Build(2*step+1,Mid(step)+1,r);
}

 void Insert(int index,int pos){
    Node[index].cnt--;
    if(Node[index].l==Node[index].r) {
        ans[Node[index].l]=P[i].val;
        return;
    }
    if(pos<=Node[2*index].cnt)  Insert(2*index,pos);
    else Insert(2*index+1,pos-Node[2*index].cnt); //因为这里WA了N次,呜呜。。。是减去Node[2*index].cnt,不是减去左边的。
                                                  //说明思路还不是很清晰!!不理解彻透!
}

int main()
{
   freopen("acm.in","r",stdin);
   while(scanf("%d",&N)!=EOF){
       Build(1,1,N);
     for(i=1 ;i<=N ;i++){
       scanf("%d%d",&P[i].pos,&P[i].val);
     }
     for(i=N ;i >0 ;i--){
       Insert(1,P[i].pos+1);
     }
     for(i=1 ;i<N ;i++){
       printf("%d ",ans[i]);
     }
     printf("%d\n",ans[N]);
   }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值