线段树的结点更新

http://acm.hdu.edu.cn/showproblem.php?pid=4217

View Code
#include<stdio.h>

struct data
{
    int l,r;
    int sum;
}node[1962144];

void build(int ll,int rr,int n)
{
    node[n].l=ll;
    node[n].r=rr;
    node[n].sum=rr-ll+1;
    if(ll==rr)return ;
    int mid=(ll+rr)>>1;
    build(ll,mid,n+n);
    build(mid+1,rr,n+n+1);
}

int point;
void search(int n,int temp)
{
    if(node[n].l==node[n].r){
        point=node[n].l;
        node[n].sum--;
        return;
    }
    
    if(temp<=node[n+n].sum)
    {
        search(n+n,temp);
    }else
    {
        search(n+n+1,temp-node[n+n].sum);
    }
    node[n].sum--;
}

int main()
{
    int t,T=0;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);

        build(1,n,1);

        int i,temp;
        __int64 all=0;
        for(i=1;i<=m;i++)
        {
            scanf("%d",&temp);
            search(1,temp);
            all+=point;
        }
        printf("Case %d: ",++T);
        printf("%I64d\n",all);
    }

    return 0;
}
原文地址:https://www.cnblogs.com/huhuuu/p/2462389.html