pku2182 Lost Cows

http://poj.org/problem?id=2182

线段树,单点更新,单点查询

#include <stdio.h>

#define lson l, m, root<<1
#define rson m+1, r, root<<1|1

#define N 80008

int sum[N<<2];

void push_up(int root)
{
    sum[root] = sum[root<<1] + sum[root<<1|1];
}

void build(int l, int r, int root)
{
    int m;
    if(l == r)
    {
        sum[root] = 1;
        return;
    }
    m = (l + r) >> 1;
    build(lson);
    build(rson);
    push_up(root);
}

void update(int x, int l, int r, int root)
{
    int m;
    if(l == r)
    {
        sum[root] = 0;
        return;
    }
    m = (l + r) >> 1;
    if(x <= m)
    {
        update(x, lson);
    }
    if(m+1 <= x)
    {
        update(x, rson);
    }
    push_up(root);
}

int query(int x, int l, int r, int root)
{
    int m;
    if(l == r)
    {
        return l;
    }
    m = (l + r) >> 1;
    if(sum[root<<1] >= x)
    {
        return query(x, lson);
    }
    return query(x-sum[root<<1], rson);
}

int main()
{
    int n, i, a[N], b[N];
    scanf("%d", &n);
    build(1, n, 1);
    for(i=2; i<=n; i++)
    {
        scanf("%d", a+i);
    }
    for(i=n; i>=2; i--)
    {
        b[i] = query(a[i]+1, 1, n, 1);
        update(b[i], 1, n, 1);
    }
    b[1] = query(1, 1, n, 1);
    for(i=1; i<=n; i++)
    {
        printf("%d\n", b[i]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yuan1991/p/pku2182.html