题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1698
解题思路
区间修改,区间查询。
这个被查询的区间不是别人,正是全部1~n。
板子题,不会线段树可以看看专栏的第一篇题解内的线段树讲解链接。
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e5+10;
struct TREE
{
int l,r,lazy,sum;
}tree[N<<2];
int T,n,q,x,y,z,cas;
void Build(int i,int l,int r)
{
tree[i].l=l;
tree[i].r=r;
tree[i].lazy=0;
tree[i].sum=0;
if(tree[i].l==tree[i].r)
{
tree[i].sum=1;
return ;
}
int mid=(l+r)>>1;
Build(i<<1,l,mid);
Build(i<<1|1,mid+1,r);
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
return ;
}
void PushDown(int i)
{
if(tree[i].lazy==0) return ;
tree[i<<1].lazy=tree[i].lazy;
tree[i<<1|1].lazy=tree[i].lazy;
tree[i<<1].sum=(tree[i<<1].r-tree[i<<1].l+1)*tree[i].lazy;
tree[i<<1|1].sum=(tree[i<<1|1].r-tree[i<<1|1].l+1)*tree[i].lazy;
tree[i].lazy=0;
return ;
}
void Update(int i,int l,int r,int c)
{
if(l<=tree[i].l && tree[i].r<=r)
{
tree[i].lazy=c;
tree[i].sum=(tree[i].r-tree[i].l+1)*c;
return ;
}
PushDown(i);
if(tree[i<<1].r>=l) Update(i<<1,l,r,c);//left
if(tree[i<<1|1].l<=r) Update(i<<1|1,l,r,c);
tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}
int main()
{
scanf("%d",&T);
while(T--)
{
cas++;
scanf("%d%d",&n,&q);
Build(1,1,n);
while(q--)
{
scanf("%d%d%d",&x,&y,&z);
Update(1,x,y,z);
}
printf("Case %d: The total value of the hook is %d.\n",cas,tree[1].sum);
}
}

京公网安备 11010502036488号