#include <stdio.h>
#include <vector>
#include <map>
#include <unordered_set>
#include <queue>
#include <unordered_map>
#include <math.h>
#include <limits.h>
#include <algorithm>
#include <functional>
#include <iterator>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int YELLOW = 1;
int BLUE = 2;
int RED = 3;
int opened[4];
struct X {
int point;
int color;
bool open;
};
bool compareX(X& x1, X& x2) {
return x1.point < x2.point || (x1.point == x2.point && x1.open);
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(NULL);
vector<X> v;
int n, m;
cin >> n >> m;
int l, r, c;
for (int i=0; i<m; ++i) {
cin >> l >> r >> c;
v.pb({l, c, true});
v.pb({r, c, false});
}
std::sort(v.begin(), v.end(), compareX);
int prev = 1;
bool green = false;
int answer = 0;
bool red_opened = false;
bool pot_green = false;
for (int i=0; i<v.size(); ++i) {
auto p = v[i];
if (p.open) {
opened[p.color] += 1;
} else {
opened[p.color] -= 1;
}
red_opened = red_opened || (p.color == RED);
pot_green = pot_green || (opened[YELLOW] && opened[BLUE]);
if (i < v.size()-1 && v[i].point == v[i+1].point) continue;
bool now_green = opened[YELLOW] && opened[BLUE] && !opened[RED];
if (green) {
answer += p.point - prev;
}
if (!red_opened && pot_green) {
answer += 1;
}
green = now_green;
prev = p.point + 1;
red_opened = opened[RED];
pot_green = green;
}
cout << answer << endl;
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 | #include <stdio.h> #include <vector> #include <map> #include <unordered_set> #include <queue> #include <unordered_map> #include <math.h> #include <limits.h> #include <algorithm> #include <functional> #include <iterator> #include <algorithm> #include <string> #include <iostream> using namespace std; #define pb push_back #define mp make_pair typedef long long ll; typedef unsigned long long ull; using namespace std; int YELLOW = 1; int BLUE = 2; int RED = 3; int opened[4]; struct X { int point; int color; bool open; }; bool compareX(X& x1, X& x2) { return x1.point < x2.point || (x1.point == x2.point && x1.open); } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); vector<X> v; int n, m; cin >> n >> m; int l, r, c; for (int i=0; i<m; ++i) { cin >> l >> r >> c; v.pb({l, c, true}); v.pb({r, c, false}); } std::sort(v.begin(), v.end(), compareX); int prev = 1; bool green = false; int answer = 0; bool red_opened = false; bool pot_green = false; for (int i=0; i<v.size(); ++i) { auto p = v[i]; if (p.open) { opened[p.color] += 1; } else { opened[p.color] -= 1; } red_opened = red_opened || (p.color == RED); pot_green = pot_green || (opened[YELLOW] && opened[BLUE]); if (i < v.size()-1 && v[i].point == v[i+1].point) continue; bool now_green = opened[YELLOW] && opened[BLUE] && !opened[RED]; if (green) { answer += p.point - prev; } if (!red_opened && pot_green) { answer += 1; } green = now_green; prev = p.point + 1; red_opened = opened[RED]; pot_green = green; } cout << answer << endl; return 0; } |
English