poj2828-Buy Tickets

Buy Tickets
Time Limit: 4000MS   Memory Limit: 65536K
Total Submissions: 10464   Accepted: 5069

Description

Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue…

The Lunar New Year was approaching, but unluckily the Little Cat still had schedules going here and there. Now, he had to travel by train to Mianyang, Sichuan Province for the winter camp selection of the national team of Olympiad in Informatics.

It was one o’clock a.m. and dark outside. Chill wind from the northwest did not scare off the people in the queue. The cold night gave the Little Cat a shiver. Why not find a problem to think about? That was none the less better than freezing to death!

People kept jumping the queue. Since it was too dark around, such moves would not be discovered even by the people adjacent to the queue-jumpers. “If every person in the queue is assigned an integral value and all the information about those who have jumped the queue and where they stand after queue-jumping is given, can I find out the final order of people in the queue?” Thought the Little Cat.

Input

There will be several test cases in the input. Each test case consists of N + 1 lines where N (1 ≤ N ≤ 200,000) is given in the first line of the test case. The next N lines contain the pairs of values Posi and Vali in the increasing order of i (1 ≤ i ≤ N). For each i, the ranges and meanings of Posi and Vali are as follows:

  • Posi ∈ [0, i − 1] — The i-th person came to the queue and stood right behind the Posi-th person in the queue. The booking office was considered the 0th person and the person at the front of the queue was considered the first person in the queue.
  • Vali ∈ [0, 32767] — The i-th person was assigned the value Vali.

There no blank lines between test cases. Proceed to the end of input.

Output

For each test cases, output a single line of space-separated integers which are the values of people in the order they stand in the queue.

Sample Input

4
0 77
1 51
1 33
2 69
4
0 20523
1 19243
1 3890
0 31492

Sample Output

77 33 69 51
31492 20523 3890 19243

Hint

The figure below shows how the Little Cat found out the final order of people in the queue described in the first test case of the sample input.

地址:http://poj.org/problem?id=2828

今天比赛第一题。。。。。把i--写成了i++,永远无法运行。。。。。。。。debug了好久

插队,图通俗易懂。。。题就不需解释了。。。此题的妙招是从后往前确定,如0,1,1,2,从2开始,再1,下一个1被占了,于是它去3,最后0就是0.。。。。。普通的贪心一定超时,线段树,初始值为1,有人占了位置就变成0,通过二分查前面有多少空座,从2开始,坐到第二个空座上,就是前面的1加一起等于2,然后1坐第一个空座上,下一个1还是第一个空座,满座不能坐人,0还是0,,哦了。。。。。。。。。。

代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <queue>
#include <algorithm>
#define lson l , m , rt << 1//左儿子,rt/2
#define rson m + 1 , r , rt << 1 | 1//右儿子,rt/2+1
using namespace std;
const int maxn = 222222;
struct Node
{
    int b,v;
    bool operator < (const Node& a) const
    {
        return b < a.b;
    }
    //Node(){}
    //Node(int _b, int _h, int _w, int _d){b=_b;h=_h;w=_w;d=_d;}
};
Node a[200000];
int sum[maxn<<2];
 int n,p[200000],v[200000],b[200000];
void PushUP(int rt) {
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];//root=lson+rson
}
void build(int l,int r,int rt) {
    sum[rt]=1;//0,1替换,1的和可以算出个数
    if (l == r) {
        return ;
    }
    int m = (l + r) >> 1;//右移一位相当于除以二
    build(lson);
    build(rson);
    PushUP(rt);
}
void update(int p,int l,int r,int rt)//单点替换
 {
    if (l == r) {
        sum[rt] =0;
        return ;
    }
    int m = (l + r) >> 1;
    if (p <= m) update(p , lson);
    else update(p , rson);
    PushUP(rt);
}
int query(int p ,int l,int r,int rt)//区间求和
 {
    if (l==r) {
        return l;
    }
    int m = (l + r) >> 1;
    if (sum[rt<<1]<p) return query(p -sum[rt<<1], rson);
    else return query(p , lson);

}

int main()
{
    while(scanf("%d",&n)!=EOF){
        build(1,n,1);
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&p[i],&a[i].v);
        }
        for(int i=n-1;i>=0;i--)
        {
            a[i].b=query(p[i]+1,1,n,1);
            update(a[i].b,1,n,1);

        }
        sort(a,a+n);
        for(int i=0;i<n-1;i++)
        {
            printf("%d ",a[i].v);
        }
        printf("%d\n",a[n-1].v);
    }
    return 0;
}

越来越笨了,加上休息不好,一天困得直点头,比赛中都想睡觉,但不敢。。。。。。进度还慢,于是今天比赛以0A收尾,找个地缝让我钻进去吧,大家为啥都那么快呢?还是我的问题。。。。。。。。。

 

posted @ 2013-08-01 00:14  SunnySnail  阅读(149)  评论(0编辑  收藏  举报