要求线段树区间修改,那就修改一下懒标记和赋值。
#include <bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define ll long long
#define ld long double
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define lcm(a,b) ((a)*(b)/(__gcd((a),(b))))
#define Max 200005
#define mod 1000000007
using namespace std;
typedef pair<int, int> pii;
ll n, m, sum[Max << 2], add[Max << 2], f, a, b;
void pushup(ll rt) {
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void PushDown(int rt, int ln, int rn) {
//ln,rn为左子树,右子树的数字数量。
if(add[rt]) {
//下推标记
add[rt << 1] = add[rt << 1 | 1] = add[rt];
//修改子节点的Sum使之与对应的Add相对应
sum[rt << 1] = add[rt] * ln;
sum[rt << 1 | 1] = add[rt] * rn;
//清除本节点标记
add[rt] = 0;
}
}
void build(ll l, ll r, ll rt) {
add[rt] = 0;
if(l == r) {
//scanf("%lld", &sum[rt]);
sum[rt] = 1;
return;
}
ll m = (r + l) >> 1;
build(l, m, rt << 1);
build(m + 1, r, rt << 1 | 1);
pushup(rt);
}
void Update(int L, int R, int C, int l, int r, int rt) { //L,R表示操作区间,l,r表示当前节点区间,rt表示当前节点编号
if(L <= l && r <= R) { //如果本区间完全在操作区间[L,R]以内
sum[rt] = C * (r - l + 1); //更新数字和,向上保持正确
add[rt] = C; //增加Add标记,表示本区间的Sum正确,子区间的Sum仍需要根据Add的值来调整
return ;
}
int m = (l + r) >> 1;
PushDown(rt, m - l + 1, r - m); //下推标记
//这里判断左右子树跟[L,R]有无交集,有交集才递归
if(L <= m)
Update(L, R, C, l, m, rt << 1);
if(R > m)
Update(L, R, C, m + 1, r, rt << 1 | 1);
pushup(rt);
}
void update(ll L, ll C, ll l, ll r, ll rt) {
if(l == r) {
sum[rt] = C;
return ;
}
ll m = (l + r) >> 1;
if(L <= m)
update(L, C, l, m, rt << 1);
else
update(L, C, m + 1, r, rt << 1 | 1);
pushup(rt);
}
ll query(ll L, ll R, ll l, ll r, ll rt) {
if(L <= l && r <= R) {
return sum[rt];
}
ll m = (r + l) >> 1;
PushDown(rt, m - l + 1, r - m);
ll ans = 0;
if(L <= m)
ans += query(L, R, l, m, rt << 1);
if(R > m)
ans += query(L, R, m + 1, r, rt << 1 | 1);
return ans;
}
int main() {
IOS
int t, p = 0;
cin >> t;
while(t--) {
cin >> n;
build(1, n, 1);
cin >> m;
for(int i = 0; i < m; i++) {
cin >> a >> b >> f;
Update(a, b, f, 1, n, 1);
}
printf("Case %d: The total value of the hook is %lld.\n", ++p, query(1, n, 1, n, 1));
}
return 0;
}