hdu1698Just a Hook(線段樹區間更新)

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

注意:優先級 +、-高於>>

#include<cstdio>
using namespace std;
const int num=100005;
struct node
{
    int l,r,sum,lnc;
}data[num<<2];
void up(int rt)
{
    data[rt].sum=data[rt<<1].sum+data[rt<<1|1].sum;
}
void down(int rt)
{
    int d=data[rt].r-data[rt].l+1;
    if(data[rt].lnc!=0)
    {
        data[rt<<1].lnc=data[rt<<1|1].lnc=data[rt].lnc;
        data[rt<<1].sum=data[rt].lnc*(d-(d>>1));  //>>優先級比-低
        data[rt<<1|1].sum=data[rt].lnc*(d>>1);
        data[rt].lnc=0;
    }
}
void build (int rt,int l,int r)
{
    data[rt].l=l;
    data[rt].r=r;
    data[rt].lnc=0;
    if(l==r)
    {
        data[rt].sum=1;
        return ;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    up(rt);
}
void Updata(int rt,int L,int R,int a)
{
    if(data[rt].l==L&&data[rt].r==R)
    {
        data[rt].lnc=a;
        data[rt].sum=(R-L+1)*a;
        return ;
    }
    down(rt);
    int mid=(data[rt].l+data[rt].r)>>1;
    if(R<=mid)
        Updata(rt<<1,L,R,a);
    else if(L>mid)
        Updata(rt<<1|1,L,R,a);
    else
    {
        Updata(rt<<1,L,mid,a);
        Updata(rt<<1|1,mid+1,R,a);
    }
    up(rt);
}
int main()
{
    int t,n,m,a,b,c,i,k;
    //freopen("in.txt","r",stdin);
    scanf("%d",&t);
    for(k=1;k<=t;k++)
    {
        scanf("%d%d",&n,&m);
        build(1,1,n);
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            Updata(1,a,b,c);
        }
        printf("Case %d: The total value of the hook is %d.\n",k,data[1].sum);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章