题意: 给钩子的价值更新,给出区间,查找区间价值
思路:加lazy标记,不必更新到每个子节点
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#define lson i<<1,left,mid
#define rson i<<1|1,mid+1,right
using namespace std;
struct TreeNode
{
int lazy,val,left,right,tag;
} Tree[400005];
void Build(int i , int left , int right )
{
Tree[i].lazy=0;
Tree[i].left=left;
Tree[i].right=right;
Tree[i].tag=0;
if(left==right)
{
Tree[i].val=1;
return ;
}
int mid=(left+right)>>1;
Build(lson);
Build(rson);
Tree[i].val=Tree[i<<1].val+Tree[i<<1|1].val;
}
void update(int i,int left, int right , int w)
{
if(Tree[i].left==left && Tree[i].right ==right )
{
Tree[i].tag=w;
Tree[i].lazy=1;
Tree[i].val=w*(right - left +1);
return ;
}
int mid=(Tree[i].left+Tree[i].right)>>1;
if(Tree[i].lazy==1)
{
Tree[i].lazy=0;
Tree[i<<1].lazy=Tree[i<<1|1].lazy=1;
Tree[i<<1].tag=Tree[i].tag;
Tree[i<<1|1].tag=Tree[i].tag;
Tree[i<<1].val=(Tree[i<<1].right-Tree[i<<1].left+1)*Tree[i].tag;
Tree[i<<1|1].val=(Tree[i<<1|1].right-Tree[i<<1|1].left+1)*Tree[i].tag;
Tree[i].tag=0;
}
if(right<=mid)
{
update(i<<1,left,right,w);
}
else if(left>mid)
{
update(i<<1|1,left,right,w);
}
else
{
update(lson,w);
update(rson,w);
}
Tree[i].val=Tree[i<<1].val+Tree[i<<1|1].val;
}
int main()
{
int x,y,z;
int n;
int m;
int T;
scanf("%d",&T);
int iCase=0;
while(T--)
{
iCase++;
scanf("%d%d",&n,&m);
Build(1,1,n);
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
update(1,x,y,z);
}
printf("Case %d: The total value of the hook is %d.\n",iCase,Tree[1].val);
}
return 0;
}