线段树的区间更新
#include <iostream> #include <cstdio> using namespace std; const int N = 100005; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 __int64 sum[N<<2],add[N<<2]; struct Node { int l,r; int mid() { return (l+r)>>1; } } tree[N<<2]; void PushUp(int rt) { sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } void PushDown(int rt,int m) { if(add[rt]) { add[rt<<1] = add[rt]; add[rt<<1|1] = add[rt]; sum[rt<<1] = add[rt] * (m - (m>>1)); sum[rt<<1|1] = add[rt] * (m>>1); add[rt] = 0; } } void build(int l,int r,int rt) { tree[rt].l = l; tree[rt].r = r; add[rt] = 0; if(l == r) { //scanf("%I64d",&sum[rt]); sum[rt]=1; return ; } int m = tree[rt].mid(); build(lson); build(rson); PushUp(rt); } void update(int c,int l,int r,int rt) { if(tree[rt].l == l && r == tree[rt].r) { add[rt] = c; sum[rt] = (__int64)c * (r-l+1); return; } if(tree[rt].l == tree[rt].r) return; PushDown(rt,tree[rt].r - tree[rt].l + 1); int m = tree[rt].mid(); if(r <= m) update(c,l,r,rt<<1); else if(l > m) update(c,l,r,rt<<1|1); else { update(c,l,m,rt<<1); update(c,m+1,r,rt<<1|1); } PushUp(rt); } __int64 query(int l,int r,int rt) { if(l == tree[rt].l && r == tree[rt].r) { return sum[rt]; } PushDown(rt,tree[rt].r - tree[rt].l + 1); int m = tree[rt].mid(); __int64 res = 0; if(r <= m) res += query(l,r,rt<<1); else if(l > m) res += query(l,r,rt<<1|1); else { res += query(l,m,rt<<1); res += query(m+1,r,rt<<1|1); } return res; } void output(int k,int l,int r) { printf("l=%d r=%d sum=%d\n",l,r,sum[k]); if(l==r)return ; output(k<<1,l,(l+r)/2); output(k<<1|1,(l+r)/2+1,r); } int main() { int n,m; int T,cas=0; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); build(1,n,1); for(int i=0;i<m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); update(z,x,y,1); } printf("Case %d: The total value of the hook is %d.\n",++cas,query(1,n,1)); } return 0; }本人蒟蒻,如有错误,还望指正
