题目大意:给你一个区间,N个操作,操作如下:
l r c,将区间[l,r]的所有数变成c,问最后区间的和

解题思路:线段树的区间修改,维护和

#include <cstdio>
#include <cstring>
const int N = 100010 << 2;

int val[N], sum[N], setv[N];
int n;

void build(int u, int l, int r) {
    setv[u] = -1;
    if (l == r) {
        setv[u] = -1;
        return ;
    }
    int mid = (l + r) >> 1;
    build(u << 1, l, mid);
    build((u << 1) + 1, mid + 1, r);
}

void PushDown(int u) {
    if (setv[u] == -1) return ;
    setv[u << 1] = setv[(u << 1) + 1] = setv[u];
    setv[u] = -1;
}

void modify(int u, int l, int r, int L, int R, int c) {
    if (L <= l && r <= R) {
        setv[u] = c;
        return ;
    }
    PushDown(u);
    int mid = (l + r) >> 1;
    if (L <= mid) modify(u << 1, l, mid, L, R, c);
    if (R > mid) modify((u << 1) + 1, mid + 1, r, L, R, c);
}


void PushUp(int u, int l, int r) {
    if (setv[u] != -1) {
        sum[u] = (r - l + 1) * setv[u];
        return ;
    }

    if (l == r) {
        sum[u] = 1;
        return ;
    }

    int mid = (l + r) >> 1;
    PushUp(u << 1, l, mid);
    PushUp((u << 1) + 1, mid + 1, r);
    sum[u] = sum[u << 1] + sum[(u << 1) + 1];
}

int cas = 1;
void solve() {
    int p;
    scanf("%d", &p);
    while (p--) {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        modify(1, 1, n, x, y, z);
    }
    PushUp(1, 1, n);
    printf("Case %d: The total value of the hook is %d.\n", cas++, sum[1]);
}


int main() {
    int test;
    scanf("%d", &test);
    while (test--) {
        scanf("%d", &n);
        build(1, 1, n);
        solve();
    }
    return 0;
}