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"); }}