hdu1698(线段树区间修改)

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

int T, cas;
int n, m;
int x, y, w;
LL add[100005 << 2], t[100005 << 2];

void up(int p){
	t[p] = t[p << 1] + t[p << 1 | 1];
}

void down(int p, int len){
	if(add[p]){
		add[p << 1] = add[p];
		add[p << 1 | 1] = add[p];
		t[p << 1] = add[p] * (len - (len >> 1));
		t[p << 1 | 1] = add[p] * (len >> 1);
		add[p] = 0;
	}
}

void build(int p, int l, int r){
	add[p] = 0;
	if(l == r){
		t[p] = 1;
		return ;
	}
	int mid = (l + r) >> 1;
	build(p << 1, l, mid);
	build(p << 1 | 1, mid + 1, r);
	up(p);
}

void modify(int p, int L, int R, int l, int r, int w){
	if(L <= l && r <= R){
		add[p] = w;
		t[p] = (LL)w * (r - l + 1);
		return ;
	}
	down(p, r - l + 1);
	int mid = (l + r) >> 1;
	if(L <= mid){
		modify(p << 1, L, R, l, mid, w);
	}
	if(mid < R){
		modify(p << 1 | 1, L, R, mid + 1, r, w);
	}
	up(p);
}

LL querry(int p, int L, int R, int l, int r){
	if(L <= l && r <= R){
		return t[p];
	}
	down(p, r - l + 1);
	int mid = (l + r) >> 1;
	LL ans = 0;
	if(L <= mid) ans += querry(p << 1, L, R, l, mid);
	if(mid < R) ans += querry(p << 1 | 1, L, R, mid + 1, r);
	return ans;
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	scanf("%d", &T);
	while(T--){
		scanf("%d %d", &n, &m);
		build(1, 1, n);
		for (int i = 1; i <= m; i++){
			scanf("%d %d %d", &x, &y, &w);
			modify(1, x, y, 1, n, w);
		}
		printf("Case %d: The total value of the hook is %lld.\n", ++cas, querry(1, 1, n, 1, n));
	}

	return 0;
}
/**/

 

全部评论

相关推荐

牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务