HDU 4217 Data Structure?(线段树版)

题目链接

线段树 不熟啊。。。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 262145
__int64 sum;
struct node
{
    int l;
    int r;
    __int64 v;
}p[4*N];
void push(int rt)
{
    p[rt].v = p[rt<<1].v+p[rt<<1|1].v;
}
void build(int l,int r,int rt)
{
    int m;
    p[rt].l = l;
    p[rt].r = r;
    if(l == r)
    {
        p[rt].v = 1;
        return ;
    }
    m = (l + r)>>1;
    build(l,m,rt<<1);
    build(m+1,r,rt<<1|1);
    push(rt);
}
void update(int pos,int l,int r,int rt)
{
    int m;
    if(l == r)
    {
        sum += l;
        p[rt].v = 0;
        return ;
    }
    m = (l +r)>>1;
    if(pos > p[rt<<1].v)
    {
        update(pos-p[rt<<1].v,m+1,r,rt<<1|1);
    }
    else
    {
        update(pos,l,m,rt<<1);
    }
    push(rt);
}
int main()
{
    int i,n,m,t,num = 0,s;
    scanf("%d",&t);
    while(t--)
    {
        memset(p,0,sizeof(p));
        num ++;
        sum = 0;
        scanf("%d",&n);
        build(1,n,1);
        scanf("%d",&m);
        for(i = 1;i <= m;i ++)
        {
            scanf("%d",&s);
            update(s,1,n,1);
        }
        printf("Case %d: %I64d\n",num,sum);
    }
    return 0;
}

  

posted @ 2012-08-10 10:35  Naix_x  阅读(152)  评论(0编辑  收藏  举报