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;

}

  

你可能感兴趣的:(struct)