Poj2828Buy Tickets线段树

  倒着搞就可以了,先进会被后面覆盖。

#include <cstdio>

#include <cstring>

#include <algorithm>

#include <climits>

#include <string>

#include <iostream>

#include <map>

#include <cstdlib>

#include <list>

#include <set>

#include <queue>

#include <stack>

#include<math.h>

using namespace std;

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

const int maxn=222222;

int sum[maxn<<2];

int color[maxn<<2];

int a[maxn];int b[maxn];

void up(int rt)

{

    sum[rt]= sum[rt<<1]+sum[rt<<1|1];

}



void build(int l,int r,int rt)

{

    color[rt]=0;

    if(l==r){

        sum[rt]=1; return ;

    }

    int mid=(l+r)>>1;

    build(lson);

    build(rson);

    up(rt);

}



void update(int ans,int add,int l,int r,int rt)

{

    if(l==r){

        sum[rt]-=1; color[rt]= add;

        return ;

    }

    int mid=(l+r)>>1;

    if(ans<=sum[rt<<1]) update(ans,add,lson);

    else update(ans-sum[rt<<1],add,rson);

    up(rt);

}



void ask(int key,int l,int r,int rt)

{

    if(l==r){

        printf("%d ",color[rt]) ;return ;

    }

    int mid=(l+r)>>1;

    if(key<=mid) ask(key,lson);

    else ask(key,rson);

}



int main()

{

    int n;

    while(scanf("%d",&n)!=EOF){

        build(1,n,1);

        for(int i=0;i<n;i++){

            scanf("%d%d",&a[i],&b[i]);

        }

        for(int i=n-1;i>=0;i--){

            update(a[i]+1,b[i],1,n,1);

        }

        for(int i=1;i<=n;i++)

            ask(i,1,n,1);

        cout<<endl;

    }

    return 0;

}

 

你可能感兴趣的:(poj)