思路:col数组要来标记当前区间的值,一开始所有的区间都为0,然后我们更新的时候,如果当前的区间的col不为0,则说明该区间是纯的,此时,我们应该把这个区间的col往左右子树传,同时计算sum的值,由于是纯的,因此当前节点的左子树和当前节点的右子树的sum可以直接求得,然后在把当前的col改为0,表示当前节点覆盖的区间不纯。(题目懂了就好了)QAQ
/***************************************** Author :Crazy_AC(JamesQi) Time :2015 File Name : *****************************************/ // #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <algorithm> #include <iomanip> #include <sstream> #include <string> #include <stack> #include <queue> #include <deque> #include <vector> #include <map> #include <set> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <limits.h> using namespace std; #define MEM(a,b) memset(a,b,sizeof a) typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> ii; const int inf = 1 << 30; const int INF = 0x3f3f3f3f; const int MOD = 1e9 + 7; inline int Readint(){ char c = getchar(); while(!isdigit(c)) c = getchar(); int x = 0; while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); } return x; } const int maxn = 1e5 + 10; int sum[maxn << 2],col[maxn << 2]; void PushDown(int rt,int len){ if (col[rt]){ col[rt << 1] = col[rt << 1 | 1] = col[rt]; sum[rt << 1] = (len - (len >> 1)) * col[rt]; sum[rt << 1 | 1] = (len >> 1) * col[rt]; col[rt] = 0; } } void PushUp(int rt){ sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } void Build(int L,int R,int rt){ col[rt] = 0; sum[rt] = 1; // cout << "L = " << L << '\n'; // cout << "R = " << R << '\n'; if (L == R) return ; int mid = (L + R) >> 1; Build(L,mid,rt << 1); Build(mid + 1,R,rt << 1 | 1); PushUp(rt); return ; } void Updata(int L,int R,int rt,int l,int r,int color){ if (l <= L && R <= r){ col[rt] = color; sum[rt] = (R - L + 1) * color; return; } PushDown(rt,R - L + 1); int mid = (L + R) >> 1; if (l <= mid) Updata(L,mid,rt << 1,l,r,color); if (r > mid) Updata(mid + 1,R,rt << 1 | 1,l,r,color); PushUp(rt); } int n,m; int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int iCase = 0; int T; T = Readint(); // scanf("%d",&T); // cout << "ooo = " << T << endl; while(T--){ // scanf("%d%d",&n,&m); n = Readint(); m = Readint(); // cout << "n = " << n << '\n'; Build(1,n,1); for (int i = 0;i < m;++i){ int a,b,c; a = Readint(); b = Readint(); c = Readint(); Updata(1,n,1,a,b,c); } printf("Case %d: The total value of the hook is %d.\n",++iCase,sum[1]); } return 0; }