40分暴力代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 1000005; int n, m; int a[maxn][4]; // 123 int main() { cin >> n >> m; for (int i = 1; i <= m; i++) { int l, r, k; cin >> l >> r >> k; if (k == 1) { for (int j = l; j <= r; j++) { a[j][1] = 1; } } else if (k == 2) { for (int j = l; j <= r; j++) { a[j][2] = 1; } } else if (k == 3) { for (int j = l; j <= r; j++) { a[j][3] = 1; } } } int ans = 0; for (int i = 1; i <= n; i++) { if (a[i][1] == 1 && a[i][2] == 1 && a[i][3] == 0) { ans++; } } cout << ans; }
100分,前缀和+差分:
#include <bits/stdc++.h> using namespace std; const int maxn = 1000005; int n, m; int a[maxn]; int b[maxn]; int c[maxn]; // 开三个数组,存颜色前缀和 int main() { cin >> n >> m; for (int i = 1; i <= m; i++) { int l, r, k; cin >> l >> r >> k; if (k == 1) { a[l]++; a[r + 1]--; } else if (k == 2) { b[l]++; b[r + 1]--; } else if (k == 3) { c[l]++; c[r + 1]--; } } for (int i = 1; i <= n; i++) { a[i] += a[i - 1]; b[i] += b[i - 1]; c[i] += c[i - 1]; } int ans = 0; for (int i = 1; i <= n; i++) { if (a[i] && b[i] && !c[i]) { ans++; } } cout << ans; }