简单题。。。。区间更新 查找节点。。。。lazy思想想了好长时间,弄懂了。。果然很强大。。。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 400010
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
struct node{
int L,R,sum,col;
}edge[N];
void pushdown(int i,int m){
edge[LL(i)].col=edge[RR(i)].col=edge[i].col;
edge[LL(i)].sum=edge[i].col*(m-(m>>1));
edge[RR(i)].sum=edge[i].col*(m>>1);
edge[i].col=0;
}
int buit(int l,int r,int i){
edge[i].L=l,edge[i].R=r,edge[i].col=0;
if(l==r) return edge[i].sum=1;
int mid=(l+r)>>1;
return edge[i].sum=buit(l,mid,LL(i))+buit(mid+1,r,RR(i));
}
void updata(int l,int r,int i,int x){
if(l<=edge[i].L && edge[i].R<=r){
edge[i].col=x,edge[i].sum=x*(edge[i].R-edge[i].L+1);
return;
}
if(edge[i].col) pushdown(i,edge[i].R-edge[i].L+1);
int mid=(edge[i].L+edge[i].R)>>1;
if(l<=mid) updata(l,r,LL(i),x);
if(r>mid) updata(l,r,RR(i),x);
edge[i].sum=edge[LL(i)].sum+edge[RR(i)].sum;
}
int main(){
int cas,n,m,x,y,u;
scanf("%d",&cas);
for(int t=1;t<=cas;t++){
scanf("%d%d",&n,&m);
buit(1,n,1);
while(m--){
scanf("%d%d%d",&x,&y,&u);
updata(x,y,1,u);
}
printf("Case %d: The total value of the hook is %d.\n",t,edge[1].sum);
}
return 0;
}