【代码】CF915E Physical Education Lessons [动态开点线段树]
Problem - 915E - Codeforces
看我极限卡常大法:
拆结构体,少传参,奇妙小快读
#include <bits/stdc++.h>
using namespace std;const int MAXN = 1e5 + 5;
const int MAXNODE = 15000000; // === fread 快读 ===
char buf[1 << 21], *p1 = buf, *p2 = buf;
inline char gc() {return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
inline int read() {int x = 0; char c = gc();while (c < '0' || c > '9') c = gc();while (c >= '0' && c <= '9') x = x * 10 + (c ^ 48), c = gc();return x;
}// === 全局数组===
int ls[MAXNODE], rs[MAXNODE], sum[MAXNODE], tag[MAXNODE];
int cnt = 1; // 根节点为 1
int n, q;// === 全局变量避免传参 ===
int L, R, v;inline void push_down(int p, int cntl, int cntr) {if (~tag[p]) { // tag[p] != -1int t = tag[p];if (!ls[p]) ls[p] = ++cnt;if (!rs[p]) rs[p] = ++cnt;tag[ls[p]] = tag[rs[p]] = t;sum[ls[p]] = cntl * t;sum[rs[p]] = cntr * t;tag[p] = -1;}
}void change(int p, int l, int r) {if (L <= l && r <= R) {tag[p] = v;sum[p] = (r - l + 1) * v;return;}int mid = (l + r) >> 1;push_down(p, mid - l + 1, r - mid);if (L <= mid) change(ls[p], l, mid);if (R > mid) change(rs[p], mid + 1, r);sum[p] = sum[ls[p]] + sum[rs[p]];
}int main() {n = read(), q = read();// === 关键:初始化 tag 全为 -1 ===memset(tag, -1, sizeof(tag));// 初始:[1, n] 全为工作日(1)L = 1, R = n, v = 1;change(1, 1, n);while (q--) {int l = read(), r = read(), k = read();L = l, R = r, v = (k == 1 ? 0 : 1);change(1, 1, n);printf("%d\n", sum[1]);}return 0;
}