版权声明:如若转载请标明出处 https://blog.csdn.net/hwy499/article/details/83472828
题意:
有一个钩子由n个小棒构成,每个小棒有三种类型,长度分别为:1,2,3;一共有m次操作,m次操作后询问问钩子的长度,
注意:钩子的初始长度为n,即每个叶子节点的值为1
AC代码:
//裸模板题
#include <iostream>
#include <stdio.h>
#define ll long long
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define il inline
using namespace std;
const ll MAXN = 1e5 + 10;
struct Tree {
ll sum;
ll lazy;
} t[MAXN<<2];
il void push_up(ll rt) { //向上更新
t[rt].sum = t[rt << 1].sum + t[rt << 1 | 1].sum;
}
il void push_down(ll rt, ll m) {//向下更新
if(t[rt].lazy) { //若有标记,则将标记向下移动一层
t[rt << 1].lazy = t[rt].lazy;
t[rt << 1 | 1].lazy = t[rt].lazy;
t[rt << 1].sum = (m - (m >> 1)) * t[rt].lazy;
t[rt << 1 | 1].sum = (m >> 1) * t[rt].lazy;
t[rt].lazy = 0;//取消本层标记
}
}
il void build(ll l,ll r, ll rt) { //建树
t[rt].lazy = 0;
if(l == r) {
t[rt].sum=1;
return;
}
ll mid = (l + r) >> 1;
build(lson);
build(rson);
push_up(rt);//向上更新
}
il void update(ll L,ll R, ll key, ll l,ll r, ll rt) { //区间更新
if(L <= l && R >= r) {
t[rt].sum=(r - l + 1) * key;
t[rt].lazy= key;
return;
}
push_down(rt, r - l + 1);//向下更新
long long int mid = (l + r) >> 1;
if(L <= mid) update(L, R, key, lson);
if(R > mid) update(L, R, key, rson);
push_up(rt);//向上更新
}
il ll query(ll L, ll R, ll l, ll r,ll rt) { //区间求和
if(L <= l && R >= r) return t[rt].sum;
push_down(rt, r - l + 1);//向下更新
ll mid = (l + r) >> 1;
ll ans = 0;
if(L <= mid) ans += query(L, R, lson);
if(R > mid) ans += query(L, R, rson);
return ans;
}
int main() {
ll n, m,l,r,v;
int t;
cin>>t;
for(ll i=1;i<=t;i++) {
scanf("%lld%lld", &n, &m);
build(1, n, 1);
while(m--) {
scanf("%d%d%lld",&l,&r,&v);
update(l,r,v,1,n,1);
}
printf("Case %lld: The total value of the hook is %lld.\n",i,query(1,n,1,n,1));
}
return 0;
}