http://acm.hdu.edu.cn/showproblem.php?pid=1698
裸的线段树区间更新
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=100005;
struct Node
{
int sum,lazy;
}node[maxn<<2];
void pushup(int rt)
{
node[rt].sum=node[rt<<1].sum+node[rt<<1|1].sum;
}
void pushdown(int rt,int len)
{
if(node[rt].lazy)
{
node[rt<<1].lazy=node[rt].lazy;
node[rt<<1|1].lazy=node[rt].lazy;
node[rt<<1].sum=node[rt].lazy*(len-(len>>1));
node[rt<<1|1].sum=node[rt].lazy*(len>>1);
node[rt].lazy=0;//注意更新
}
}
void build(int l,int r,int rt)
{
node[rt].lazy=0;
if(l==r)
{
node[rt].sum=1;
return ;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
pushup(rt);
}
void update(int ll,int rr,int add,int l,int r,int rt)
{
if(ll<=l&&rr>=r)
{
node[rt].sum=add*(r-l+1);
node[rt].lazy=add;
return ;
}
pushdown(rt,r-l+1);
int m=(l+r)>>1;
if(ll<=m)
update(ll,rr,add,l,m,rt<<1);
if(rr>m)
update(ll,rr,add,m+1,r,rt<<1|1);
pushup(rt);
}
int main()
{
int T,t=1,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int a,b,c;
build(1,n,1);
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
update(a,b,c,1,n,1);
}
printf("Case %d: The total value of the hook is %d.\n",t++,node[1].sum);
}
return 0;
}