//https://acm.hdu.edu.cn/showproblem.php?pid=1698
//题意:有三种材料,值分别为1,2,3,初始值为1,有n个节点,q次修改,每次将x到y修改为指定值,最后输出修改后的值总和
//线段树维护区间和,区间修改
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r;
int sum;
int lazy;
}t[500005];
inline void pushup(int n){
t[n].sum=t[n<<1].sum+t[n<<1|1].sum;
return;
}
inline void pushdown(int n){
if(t[n].lazy){
t[n<<1].sum=(t[n<<1].r-t[n<<1].l+1)*t[n].lazy;
t[n<<1|1].sum=(t[n<<1|1].r-t[n<<1|1].l+1)*t[n].lazy;
t[n<<1].lazy=t[n<<1|1].lazy=t[n].lazy;
t[n].lazy=0;
}
}
inline void build(int n,int l,int r){
t[n].l=l,t[n].r=r,t[n].lazy=0;
if(l==r){
t[n].sum=1;
return;
}
int mid=l+r>>1;
build(n<<1,l,mid);
build(n<<1|1,mid+1,r);
pushup(n);
return;
}
inline void change(int n,int l,int r,int k){
if(t[n].l>r||t[n].r<l) return;
if(l<=t[n].l&&t[n].r<=r){
t[n].sum=(t[n].r-t[n].l+1)*k;
t[n].lazy=k;
return;
}
pushdown(n);
int mid=t[n].l+t[n].r>>1;
if(mid>=l) change(n<<1,l,r,k);
if(mid<r) change(n<<1|1,l,r,k);
pushup(n);
return;
}
int main(){
int T;
scanf("%d",&T);
for(int i=1;i<=T;i++){
int n,q;
scanf("%d%d",&n,&q);
build(1,1,n);
while(q--){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
change(1,x,y,k);
}
printf("Case %d: The total value of the hook is %d.\n", i, t[1].sum);
}
}
05-03
07-02
10-15
134
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交