#include<stdio.h>
#include<string.h>
#define size 100010
struct node
{
int l,r,sum,add;//sum存的是当前根节点下所有枝叶的和
}tree[size<<2];
void pushup(int n)
{
tree[n].sum=tree[n<<1].sum+tree[n<<1|1].sum;
}
void build(int l,int r,int root)
{
tree[root].l=l;
tree[root].r=r;
tree[root].add=0;
if(l==r)
{
tree[root].sum=1;
return ;
}
int mid=(l+r)>>1;
build(l,mid,root*2);
build(mid+1,r,root*2+1);
pushup(root);
}
void pushdown(int n,int m)//下放
{
if(tree[n].add)
{
tree[n<<1].add=tree[n].add;
tree[n<<1|1].add=tree[n].add;
tree[n<<1].sum=tree[n].add*(m-(m/2));
tree[n*2+1].sum=tree[n].add*(m/2);
tree[n].add=0;
}
}
void updata(int l,int r,int v,int root)
{
if(tree[root].l==l&&tree[root].r==r)
{
tree[root].add=v;
tree[root].sum=v*(r-l+1);
return ;
}
pushdown(root,tree[root].r-tree[root].l+1);
int mid=(tree[root].l+tree[root].r)/2;
if(r<=mid)
updata(l,r,v,root*2);
else if(l>mid)updata(l,r,v,root*2+1);
else
{
updata(l,mid,v,root*2);
updata(mid+1,r,v,root*2+1);
}
pushup(root);
}
int main()
{
int i,j,t,m,n,x,y,z,ca=1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
build(1,n,1);
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
updata(x,y,z,1);
}
printf("Case %d: The total value of the hook is %d.\n",ca++,tree[1].sum);
}
return 0;
}
HDU 1698 Just a Hook
最新推荐文章于 2022-12-12 21:12:45 发布