链接:点击打开链接
题意:给出一个t代表几组数据,给出一个n代表1~n都为1,然后输入命令(x,y,z),(x,y)为区间,z为将区间内的数改为z,问1~n所代表的数的和为多少
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int siz=100005;
int tree[siz<<2],lazy[siz<<2];
void build(int l,int r,int rt){
lazy[rt]=0;
if(l==r){
tree[rt]=1;
return;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void pushdown(int rt,int p){
if(lazy[rt]){
lazy[rt<<1]=lazy[rt];
lazy[rt<<1|1]=lazy[rt];
tree[rt<<1]=lazy[rt]*(p-(p>>1));
tree[rt<<1|1]=lazy[rt]*(p>>1);
lazy[rt]=0;
}
}
void Change(int L,int R,int p,int l,int r,int rt){
if(L<=l&&r<=R){
lazy[rt]=p;
tree[rt]=(r-l+1)*p;
return;
}
pushdown(rt,r-l+1);
int m=(l+r)>>1;
if(L<=m)
Change(L,R,p,l,m,rt<<1);
if(R>m)
Change(L,R,p,m+1,r,rt<<1|1);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
} //懒惰标记 线段树区间更新求和
int main(){
int t,n,m,u,v,w,cas;
scanf("%d",&t);
for(cas=1;cas<=t;cas++){
scanf("%d%d",&n,&m);
build(1,n,1);
while(m--){
scanf("%d%d%d",&u,&v,&w);
Change(u,v,w,1,n,1);
}
printf("Case %d: The total value of the hook is %d.\n",cas,tree[1]);
}
return 0;
}