POJ 2828 Buy Tickets

题目链接:POJ 2828 Buy Tickets

线段树。

看了人家的思路。

每个节点代表着这个节点下还有多少个空位,然后倒序插入,这样每个点插入的位置就是最终的位置。

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

using namespace std;

const int MAX_N = 200000 + 100;

struct Node
{
    int l,r,remain;
};
int arr[MAX_N],p[MAX_N],val[MAX_N];
Node node[MAX_N << 2];
int n;

void build(int i,int l,int r)
{
    node[i].l = l;
    node[i].r = r;
    node[i].remain = r - l + 1;
    if(l == r)
        return;
    int mid = (l + r) >> 1;
    build(i << 1,l,mid);
    build(i << 1 | 1,mid + 1,r);
}
int _insert(int i,int pos)
{
    node[i].remain--;
    if(node[i].l == node[i].r)
        return node[i].l;
    if(node[i << 1].remain >= pos)
        _insert(i << 1,pos);
    else
        _insert(i << 1 | 1,pos - node[i << 1].remain);
}
int main()
{

    while(scanf("%d",&n) != EOF)
    {
        build(1,1,n);
        for(int i = 1;i <= n;i++)
            scanf("%d %d",&p[i],&val[i]);
        for(int i = n;i > 0;i--)
        {
            int _pos = _insert(1,p[i] + 1);
            arr[_pos] = val[i];
        }
        printf("%d",arr[1]);
        for(int i = 2;i <= n;i++)
            printf(" %d",arr[i]);
        printf("\n");
    }
    return 0;
}



你可能感兴趣的:(POJ 2828 Buy Tickets)