#include <bits/stdc++.h> using namespace std; typedef long long ll; const int YELLOW = 1; const int BLUE = 2; const int RED = 3; struct Data { int l, r, color; }; int solve(const vector<Data>& A, int n) { vector<int> yellow_events(n + 1, 0); vector<int> blue_events(n + 1, 0); vector<int> red_events(n + 1, 0); for(auto it: A) { if(it.color == RED) { red_events[it.l] += it.r; red_events[it.r + 1] -= it.r; } else if(it.color == BLUE) { blue_events[it.l] += it.r; blue_events[it.r + 1] -= it.r; } else if(it.color == YELLOW) { yellow_events[it.l] += it.r; yellow_events[it.r + 1] -= it.r; } } vector<int> yellow_dec(n + 1, 0); vector<int> blue_dec(n + 1, 0); vector<int> red_dec(n + 1, 0); int ans = 0; ll yellow = 0, blue = 0, red = 0; for(int i = 1; i <= n; i++) { yellow += (yellow_events[i] + yellow_dec[i]); blue += (blue_events[i] + blue_dec[i]); red += (red_events[i] + red_dec[i]); if(yellow > 0 && blue > 0 && red == 0) { ans++; } } return ans; } // int brute(const vector<Data>& A, int n) { // vector<int> red_events(n + 1, 0); // vector<int> blue_events(n + 1, 0); // vector<int> yellow_events(n + 1, 0); // for(auto it: A) { // if(it.color == RED) { // for(int i = it.l; i <= it.r; i++) red_events[i]++; // } else if(it.color == BLUE) { // for(int i = it.l; i <= it.r; i++) blue_events[i]++; // } else if(it.color == YELLOW) { // for(int i = it.l; i <= it.r; i++) yellow_events[i]++; // } // } // ll ans = 0; // for(int i = 1; i <= n; i++) { // if(yellow_events[i] > 0 && blue_events[i] > 0 && red_events[i] == 0) ans++; // } // return ans; // } // void gen() { // srand(time(nullptr)); // vector<Data> A; // size_t errors = 0; // for(int i = 12; i <= 1000; i++) { // int n = i; // for(int op = 1; op <= i + i; op++) { // for(int j = 0; j < op; j++) { // int l = rand() % (i - 11) + 1; // int r = l + (rand() % 10); // A.push_back({l, r, rand() % 3 + 1}); // } // if(solve(A, n) == brute(A, n)) { // cout << "\r ok. op: " << op << ", n: " << n << flush; // } else { // cerr << "bug. expected: " << brute(A, n) << ", got: " << solve(A, n) << endl; // cerr << "op: " << op << ", n: " << n << endl; // for(auto it: A) { // cerr << "(" << it.l << "," << it.r << "," << it.color << ")" << endl; // } // errors++; // } // A.clear(); // } // } // cout << "\nerrors: " << errors << endl; // } int main(int argc, char const *argv[]) { int n, m; cin >> n >> m; vector<Data> A(m); for(int i = 0; i < m; i++) { int a, b, color; cin >> a >> b >> color; A[i] = { a, b, color }; } cout << solve(A, n) << endl; // gen(); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <bits/stdc++.h> using namespace std; typedef long long ll; const int YELLOW = 1; const int BLUE = 2; const int RED = 3; struct Data { int l, r, color; }; int solve(const vector<Data>& A, int n) { vector<int> yellow_events(n + 1, 0); vector<int> blue_events(n + 1, 0); vector<int> red_events(n + 1, 0); for(auto it: A) { if(it.color == RED) { red_events[it.l] += it.r; red_events[it.r + 1] -= it.r; } else if(it.color == BLUE) { blue_events[it.l] += it.r; blue_events[it.r + 1] -= it.r; } else if(it.color == YELLOW) { yellow_events[it.l] += it.r; yellow_events[it.r + 1] -= it.r; } } vector<int> yellow_dec(n + 1, 0); vector<int> blue_dec(n + 1, 0); vector<int> red_dec(n + 1, 0); int ans = 0; ll yellow = 0, blue = 0, red = 0; for(int i = 1; i <= n; i++) { yellow += (yellow_events[i] + yellow_dec[i]); blue += (blue_events[i] + blue_dec[i]); red += (red_events[i] + red_dec[i]); if(yellow > 0 && blue > 0 && red == 0) { ans++; } } return ans; } // int brute(const vector<Data>& A, int n) { // vector<int> red_events(n + 1, 0); // vector<int> blue_events(n + 1, 0); // vector<int> yellow_events(n + 1, 0); // for(auto it: A) { // if(it.color == RED) { // for(int i = it.l; i <= it.r; i++) red_events[i]++; // } else if(it.color == BLUE) { // for(int i = it.l; i <= it.r; i++) blue_events[i]++; // } else if(it.color == YELLOW) { // for(int i = it.l; i <= it.r; i++) yellow_events[i]++; // } // } // ll ans = 0; // for(int i = 1; i <= n; i++) { // if(yellow_events[i] > 0 && blue_events[i] > 0 && red_events[i] == 0) ans++; // } // return ans; // } // void gen() { // srand(time(nullptr)); // vector<Data> A; // size_t errors = 0; // for(int i = 12; i <= 1000; i++) { // int n = i; // for(int op = 1; op <= i + i; op++) { // for(int j = 0; j < op; j++) { // int l = rand() % (i - 11) + 1; // int r = l + (rand() % 10); // A.push_back({l, r, rand() % 3 + 1}); // } // if(solve(A, n) == brute(A, n)) { // cout << "\r ok. op: " << op << ", n: " << n << flush; // } else { // cerr << "bug. expected: " << brute(A, n) << ", got: " << solve(A, n) << endl; // cerr << "op: " << op << ", n: " << n << endl; // for(auto it: A) { // cerr << "(" << it.l << "," << it.r << "," << it.color << ")" << endl; // } // errors++; // } // A.clear(); // } // } // cout << "\nerrors: " << errors << endl; // } int main(int argc, char const *argv[]) { int n, m; cin >> n >> m; vector<Data> A(m); for(int i = 0; i < m; i++) { int a, b, color; cin >> a >> b >> color; A[i] = { a, b, color }; } cout << solve(A, n) << endl; // gen(); return 0; } |