题目要求是对于一个初始值均为1的区间进行区间修改,修改目标为:[a,b]区间内的值被修改为c
对于多组数据的每组数据输出q次修改后的全区间和
基本线段树了…只有两个元素需要维护:sum和add,sum表示该点的区间元素和,add表示该点代表的区间当前被赋值的大小
坑点在于多组数据= =要不是某人前(jie)车(wo)之(dai)鉴(ma)我二十分钟肯定调不过,尽管如此也WA了四次= =总之,时刻记住这是多组数据就很简单了
#include
#include
using namespace std;
int T,t,n,q,a,b,c;
int ans,x,add[800020],sum[800020];
void pushdown(int o,int l,int r)
{
if(!add[o])return;
sum[o]=add[o]*(r-l+1);
int mid=(l+r)/2;
if(l!=r)
{
add[o<<1]=add[o];
add[(o<<1)+1]=add[o];
sum[o<<1]=add[o]*(mid-l+1);
sum[(o<<1)+1]=add[o]*(r-mid+1);
}
add[o]=0;
}
void maintain(int o,int l,int r)
{
if(l!=r)
sum[o]=sum[o<<1]+sum[(o<<1)+1];
else if(add[o])sum[o]=add[o],add[o]=0;
}
int build(int o,int l,int r)
{
add[o]=0;
if(l==r)return sum[o]=1;
int mid=(l+r)/2;
return sum[o]=build(o<<1,l,mid)+build((o<<1)+1,mid+1,r);
}
void change(int o,int l,int r)
{
pushdown(o,l,r);
if(l>=a && r<=b)
{
add[o]=c;
pushdown(o,l,r);
return;
}
if(rb)return;
int mid=(l+r)/2;
change(o<<1,l,mid);
change((o<<1)+1,mid+1,r);
maintain(o,l,r);
return;
}
int main(void)
{
scanf("%d",&T);
while(++t)
{
if(t>T)break;
scanf("%d",&n);
build(1,1,n);
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d%d",&a,&b,&c);
change(1,1,n);
}
printf("Case %d: The total value of the hook is %d.\n",t,sum[1]);
}
return 0;
}