E - Just a Hook
思路:区间修改即可。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int t,n,m,tot; struct nond{ int l,r; int sum,falg; }tree[101000*4]; void up(int now){ tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum; } void build(int now,int l,int r){ tree[now].l=l; tree[now].r=r; if(tree[now].l==tree[now].r){ tree[now].sum=1; return ; } int mid=(tree[now].l+tree[now].r)>>1; build(now<<1,l,mid); build(now<<1|1,mid+1,r); up(now); } void down(int now){ tree[now<<1].sum=(tree[now<<1].r-tree[now<<1].l+1)*tree[now].falg; tree[now<<1|1].sum=(tree[now<<1|1].r-tree[now<<1|1].l+1)*tree[now].falg; tree[now<<1].falg=tree[now<<1|1].falg=tree[now].falg; tree[now].falg=0; } void change(int now,int l,int r,int x){ if(tree[now].l==l&&tree[now].r==r){ tree[now].sum=(tree[now].r-tree[now].l+1)*x; tree[now].falg=x; return; } if(tree[now].falg) down(now); int mid=(tree[now].l+tree[now].r)>>1; if(r<=mid) change(now<<1,l,r,x); else if(l>mid) change(now<<1|1,l,r,x); else{ change(now<<1,l,mid,x);change(now<<1|1,mid+1,r,x); } up(now); } int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n);tot++; memset(tree,0,sizeof(tree)); build(1,1,n);scanf("%d",&m); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); change(1,x,y,z); } printf("Case %d: The total value of the hook is %d.\n",tot,tree[1].sum); } }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。