POJ 2828 Buy Tickets

来源:互联网 发布:理光复印机网络打印 编辑:程序博客网 时间:2024/05/24 07:01

题目链接: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;}



0 0