hdu1698Just a Hook(线段树区间更新)

来源:互联网 发布:windows清理助手怎么样 编辑:程序博客网 时间:2024/05/17 17:16

题目链接: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;}


0 0
原创粉丝点击