#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #include <string> #include <vector> #include <list> #include <map> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <numeric> #include <functional> using namespace std; #define LL long long #define DB double #define N 100500 const int INF = 0x3f3f3f3f; const LL INFF = 1LL << 60; const DB EPS = 1e-9; const DB OO = 1e15; const DB PI = acos(-1.0); int sum[N*4],col[N*4],ql,qr,v; void Pushup(int rt) { sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } void build(int rt,int l,int r) { sum[rt] = 1; col[rt] = 0; if(l == r) {return ;} int m = (l+r)>>1; build(rt<<1,l,m); build(rt<<1|1,m+1,r); Pushup(rt); return ; } void Pushdown(int rt,int m) { if(col[rt]) { col[rt<<1] = col[rt<<1|1] = col[rt]; sum[rt<<1] = (m-(m>>1))*col[rt]; sum[rt<<1|1] = (m>>1)*col[rt]; col[rt] = 0; return ; } } void updata(int rt,int l,int r) { if(l>=ql&&r<=qr) { sum[rt] = (r-l+1)*v; col[rt] = v; // Pushup(rt); return ; } Pushdown(rt,r-l+1); int m = (l+r)>>1; if(ql<=m) updata(rt<<1,l,m); if(m<qr) updata(rt<<1|1,m+1,r); Pushup(rt); } int main() { int n,m,t,cas = 1; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); build(1,1,n); while(m--) { scanf("%d %d %d",&ql,&qr,&v); updata(1,1,n); } printf("Case %d: The total value of the hook is %d. ",cas++,sum[1]); } return 0; }
线段树区间修改