hdu1698

思路: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;
}


你可能感兴趣的:(线段树,区间更新)