HDU 1698 线段树区间维护

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 20;
struct edge {
    int sum, tag;
}seg[N << 2];
int T, n, m;
void update(int id) {
    seg[id].sum = seg[id << 1].sum + seg[id << 1 | 1].sum;
}
void build(int id, int l, int r) {
    if (l == r) {
        seg[id].sum = 1; seg[id].tag = 0;
        return;
    }
    int mid = (l + r) >> 1;
    build(id << 1, l, mid); 
    build(id << 1 | 1, mid + 1, r);
    update(id);
}
void push_down(int id, int l, int r) {
    int mid = (l + r) >> 1;
    seg[id << 1].sum = (mid - l + 1) * seg[id].tag;
    seg[id << 1 | 1].sum = (r - mid) * seg[id].tag;

    seg[id << 1].tag = seg[id].tag;
    seg[id << 1 | 1].tag = seg[id].tag;

    seg[id].tag = 0;
}
void modify(int id, int l, int r, int ql, int qr, int v) {
    if (l == ql && r == qr) {
        seg[id].tag = v; seg[id].sum = (r - l + 1) * v;
        return;
    }
    if(seg[id].tag) push_down(id, l, r);
    int mid = (l + r) >> 1;
    if (qr <= mid) modify(id << 1, l, mid, ql, qr, v);
    else if (ql > mid) modify(id << 1 | 1, mid + 1, r, ql, qr, v);
    else {
        modify(id << 1, l, mid, ql, mid, v);
        modify(id << 1 | 1, mid + 1, r, mid + 1, qr, v);
    }
    update(id);
}
int main() {
    scanf("%d", &T);
    int cnt = 0;
    while (T--) {
        scanf("%d%d", &n, &m);
        build(1, 1, n);
        int a, b, c;
        for (int i = 1; i <= m; i++) {
            scanf("%d%d%d", &a, &b, &c);
            modify(1, 1, n, a, b, c);
        }
        printf("Case %d: The total value of the hook is %d.\n", ++cnt, seg[1].sum);
    }
    return 0;
}

 

posted @ 2022-12-23 14:31  Aacaod  阅读(14)  评论(0编辑  收藏  举报