码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 线段树

时间:2014-11-03 17:45:47      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:blog   io   2014   log   amp   as   ui   file   return   

给出N个节点,M次操作,和p

每次操作 对l-r区间的每个节点+c,若节点值>=p,则加2*c;


结点存当前区间伤害最小值,最大值,以及lazy操作。更新到如果最小值大于等于P,或者最大值小于P为止。


#include "stdio.h"
#include "string.h"

struct node
{
    int l,r,Min,Max,lazy;
} data[800010];
int p;

int Max(int a,int b)
{
    if (a<b) return b;
    else return a;
}

int Min(int a,int b)
{
    if (a<b) return a;
    else return b;
}

void build(int l,int r,int k)
{
    int mid;
    data[k].l=l;
    data[k].r=r;
    data[k].Min=data[k].Max=data[k].lazy=0;

    if (l==r) return ;

    mid=(l+r)/2;

    build(l,mid,k*2);
    build(mid+1,r,k*2+1);
}

void Pushdown(int k)
{
    if (data[k].l==data[k].r) return ;
    if (data[k].lazy!=0)
    {
        data[k*2].lazy+=data[k].lazy;
        data[k*2].Max+=data[k].lazy;
        data[k*2].Min+=data[k].lazy;
        data[k*2+1].lazy+=data[k].lazy;
        data[k*2+1].Max+=data[k].lazy;
        data[k*2+1].Min+=data[k].lazy;
        data[k].lazy=0;
    }
}
void updata(int l,int r,int k,int op)
{
    int mid;
    if (data[k].l==l && data[k].r==r)
    {
        if (data[k].Max<p)
        {
            data[k].lazy+=op;
            data[k].Max+=op;
            data[k].Min+=op;
            return ;
        }
        if (data[k].Min>=p)
        {
            data[k].lazy+=2*op;
            data[k].Max+=2*op;
            data[k].Min+=2*op;
            return ;
        }

    }

    Pushdown(k);

    mid=(data[k].l+data[k].r)/2;

    if (r<=mid) updata(l,r,k*2,op);
    else if (l>mid) updata(l,r,k*2+1,op);
    else
    {
        updata(l,mid,k*2,op);
        updata(mid+1,r,k*2+1,op);
    }
    data[k].Max=Max(data[k*2].Max,data[k*2+1].Max);
    data[k].Min=Min(data[k*2].Min,data[k*2+1].Min);
}

void query(int k)
{
    if(data[k].l==data[k].r)
    {
        if (data[k].l!=1)
            printf(" %d",data[k].Max);
        else
            printf("%d",data[k].Max);
        return ;
    }
    Pushdown(k);
    query(k*2);
    query(k*2+1);
}

int main()
{
    int n,m,l,r,x;
    while (scanf("%d%d%d",&n,&m,&p)!=EOF)
    {
        build(1,n,1);
        while (m--)
        {
            scanf("%d%d%d",&l,&r,&x);
            updata(l,r,1,x);
        }
        query(1);
        printf("\n");
    }
    return 0;
}


HDU 线段树

标签:blog   io   2014   log   amp   as   ui   file   return   

原文地址:http://blog.csdn.net/u011932355/article/details/40743965

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!