题意
有一个长度为n的铁做的棒,为1,你可以给他包银,但是包银的区域就会变成2,也可以给他包金,但是包金的区域会变成3,经过多次变换叫你求这个棒的值。
AC代码
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxn=100000;
struct node {
int l,r,val,lazy;
}tree[maxn*4];//开4bei
void build(int left,int right,int id){
tree[id].l=left;
tree[id].r=right;
tree[id].lazy=0;
if(tree[id].l==tree[id].r){
tree[id].val=1;
return ;
}
int mid=(left+right)/2;
build(left,mid,id*2);
build(mid+1,right,id*2+1);
tree[id].val=tree[id*2].val+tree[id*2+1].val;
}
void updown(int id){//注意“+=”laey置零
if(tree[id].lazy!=0){
tree[id*2].lazy=tree[id].lazy;
tree[id*2+1].lazy=tree[id].lazy;
tree[id*2].val=tree[id].lazy*(tree[id*2].r-tree[id*2].l+1);
tree[id*2+1].val=tree[id].lazy*(tree[id*2+1].r-tree[id*2+1].l+1);
tree[id].lazy=0;
}
}
void update(int left,int right,int val,int id){
if(left<=tree[id].l&&tree[id].r<=right){
tree[id].lazy=val;//注意这里不是“+=”
tree[id].val=val*(tree[id].r-tree[id].l+1);//这里也不要“+=” 因为它是set重置
return;
}
updown(id);
int mid=(tree[id].l+tree[id].r)/2;
if(right<=mid){
update(left,right,val,id*2);
}
else if(left>=mid+1){
update(left,right,val,id*2+1);
}
else {
update(left,mid,val,id*2);
update(mid+1,right,val,id*2+1);
}
tree[id].val=tree[id*2].val+tree[id*2+1].val;//这里就是向上推,递归先向下
}
int main (){
int t,count1=1;
scanf ("%d",&t);
while (t--){
int len,q;
scanf ("%d %d",&len,&q);
build(1,len,1);
while (q--){
int x,y,val;
scanf ("%d %d %d",&x,&y,&val);
update(x,y,val,1);
}
printf ("Case %d: The total value of the hook is %d.\n",count1++,tree[1].val);
}
return 0;
}