线段树求整个区间的和
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <vector>
#include <cstring>
#include <algorithm>
#define INF 0x3fffffff
#define N 100010
#define M (N << 2)
#define LL long long
#define mod 95041567
using namespace std;
struct Node{
int set;
int sum;
int l, r;
};
Node p[M];
void build(int rt, int l, int r){
p[rt].l = l;
p[rt].r = r;
p[rt].set = 0;
if(l == r){
p[rt].sum = 1;
return ;
}
int mid = (r - l) / 2 + l;
int lc = rt << 1;
int rc = lc + 1;
build(lc, l, mid);
build(rc, mid + 1, r);
p[rt].sum = p[lc].sum + p[rc].sum;
}
void pushdown(int rt){
if(! p[rt].set) return ;
int lc = rt << 1;
int rc = lc + 1;
p[lc].set = p[rc].set = p[rt].set;
p[lc].sum = p[lc].set * (p[lc].r - p[lc].l + 1);
p[rc].sum = p[rc].set * (p[rc].r - p[rc].l + 1);
p[rt].set = 0;
}
void update(int rt, int l, int r, int L, int R, int val){
if(l == L && r == R) {
p[rt].set = val;
p[rt].sum = (R - L + 1) * val;
return ;
}
pushdown(rt);
int mid = (r - l) / 2 + l;
int lc = rt << 1;
int rc = lc + 1;
if(R <= mid) update(lc, l, mid, L, R, val);
else if(L > mid) update(rc, mid + 1, r, L, R, val);
else {
update(lc, l, mid, L, mid, val);
update(rc, mid + 1, r, mid + 1, R, val);
}
p[rt].sum = p[lc].sum + p[rc].sum;
}
int main() {
// freopen("in.txt", "r", stdin);
int n, m, t, cnt = 0;
scanf("%d", &t);
while(t --){
scanf("%d %d", &n, &m);
build(1, 1, n);
while(m --){
int i, j, val;
scanf("%d %d %d", &i, &j, &val);
update(1, 1, n, i, j, val);
}
printf("Case %d: The total value of the hook is %d.\n", ++ cnt, p[1].sum);
}
return 0;
}
hdu 1698 Just a Hook
最新推荐文章于 2023-01-13 21:45:58 发布