题意:
屠夫的钩子有三种连起来,他可以改变某一段的钩子种类来改变钩子的长度m次。问m次后改变链子的长度。
思路:
这个算是区间赋值吧,在最后在输出整个区间的和,lazy标记和处理完孩子后更新当前节点一个不能少。
因为是赋值,所以lazy标记不要去累加。
Code:
#include<algorithm> #include<cstring> #include<cstdio> using namespace std; typedef long long ll; const int maxn=1e5+7; inline ll read() { ll s = 0, w = 1; char ch = getchar(); while (ch < 48 || ch > 57) { if (ch == '-') w = -1; ch = getchar(); } while (ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar(); return s * w; } int tree[maxn<<2],rz[maxn<<2]; inline pushdown(int rt,int len) { if(rz[rt]) { tree[rt<<1]=rz[rt]*(len-(len>>1)); tree[rt<<1|1]=rz[rt]*(len>>1); rz[rt<<1]=rz[rt<<1|1]=rz[rt]; rz[rt]=0; } } inline void build(int l,int r,int rt) { rz[rt]=0; if(l==r) { tree[rt]=1; return; } int mid=l+r>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); tree[rt]=tree[rt<<1]+tree[rt<<1|1]; } inline void update(int x,int y,int val,int l,int r,int rt) { if(x<=l&&y>=r) { tree[rt]=val*(r-l+1); rz[rt]=val; return; } int mid=l+r>>1; pushdown(rt,r-l+1); if(x<=mid) update(x,y,val,l,mid,rt<<1); if(y>mid) update(x,y,val,mid+1,r,rt<<1|1); tree[rt]=tree[rt<<1]+tree[rt<<1|1]; } int main() { int t=read(),n,m,x,y,z,cas=0; while(t--) { n=read(),m=read(); build(1,n,1); while(m--) { x=read(),y=read(),z=read(); update(x,y,z,1,n,1); } printf("Case %d: The total value of the hook is %d.\n",++cas,tree[1]); } return 0; }