poj 2182

来源:互联网 发布:淘宝买客户资料 编辑:程序博客网 时间:2024/05/18 03:47
倒着推 和 poj2828 一样#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 8008;#define LL(x) (x<<1)#define RR(x) (x<<1|1)#define MID(a, b) ((a+b)>>1)int y[maxn], n;struct node{    int lft, rht, value;    int mid()    {        return MID(lft, rht);    }};struct Segtree{    node tree[maxn*4];    void build(int lft, int rht, int inf)    {        tree[inf].lft = lft;        tree[inf].rht = rht;        tree[inf].value = rht-lft+1;        if(lft != rht)        {            int mid = tree[inf].mid();            build(lft, mid, LL(inf));            build(mid+1, rht, RR(inf));        }    }    int update(int val, int inf)    {        if(tree[inf].lft == tree[inf].rht)        {            tree[inf].value = 0;            return tree[inf].lft;        }        int pos;        if(tree[LL(inf)].value >= val) pos = update(val, LL(inf));        else pos = update(val-tree[LL(inf)].value, RR(inf));        tree[inf].value = tree[LL(inf)].value + tree[RR(inf)].value;        return pos;    }}seg;int main(){    while(scanf("%d", &n) != EOF)    {        seg.build(1, n, 1);        int x[maxn], x1[maxn], a[maxn];        memset(a, 0, sizeof(a));        memset(x1, 0, sizeof(x1));        for(int i = 0; i < n-1; i++) scanf("%d", &x[i]);        for(int i = n-2; i >= 0; i--)        {            x1[i] = seg.update(x[i]+1, 1);            a[x1[i]] = 1;        }        for(int i = 1; i <= n; i++)            if(a[i] == 0)            {                printf("%d\n", i);                break;            }        for(int i = 0; i < n-1; i++)            printf("%d\n", x1[i]);        //printf("\n");    }}

原创粉丝点击