POJ 2828 Buy Tickets

題目:http://poj.org/problem?id=2828

題意:

排隊買票,有插隊的,輸出最終的隊伍序列。

思路:

總共就有n個位置。

因爲最後一個選定位置後就自身位置就確定了,依次向前,所以倒序遍歷,線段樹中儲存的是當前位置向前還有多少個位置。

#include <stdio.h>
#include <iostream>

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

using namespace std;
const int maxn = 200004;
int pos[maxn];
int val[maxn];
int tree[maxn<<2];
void PushUp(int rt){
    tree[rt] = tree[rt<<1]+tree[rt<<1|1];
}
void build(int l,int r,int rt){
    tree[rt] = r - l + 1;
    if(l == r){
        return;
    }
    int m = (l+r)>>1;
    build(lson);
    build(rson);
}
int id;
void update(int p,int l,int r,int rt){
    if(l == r){
        id = l;
        tree[rt]=0;
        return;
    }
    int m = (l+r)>>1;
    if(tree[rt<<1] >= p)
        update(p,lson);
    else{
        p -= tree[rt<<1];
        update(p,rson);
    }
    PushUp(rt);
}
int main(){
    int n;
    while(~scanf("%d",&n)){
        for(int i = 1;i <= n;i++)
            scanf("%d%d",pos+i,val+i);
        int ans[maxn];
        build(1, n, 1);
        for(int i = n;i > 0;i--){
            update(pos[i]+1, 1, n, 1);
            ans[id] = val[i];
        }
//        for(int i = 1;i < n*4;i++)
//            printf("%d ",tree[i]);
        printf("%d",ans[1]);
        for(int i = 2;i <= n;i++)
            printf(" %d",ans[i]);
        printf("\n");
    }
    return 0;
}


發佈了229 篇原創文章 · 獲贊 12 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章