題目鏈接: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;
}