#include <iostream> #include <bits/stdc++.h> #define ll long long #define ld long double #define pii pair<int,int> #define pll pair<ll,ll> #define fi first #define se second using namespace std; struct Point{ int coordinate; int color; bool begin; }; bool compareByCoordinate(const Point &a, const Point &b) { if(a.coordinate != b.coordinate) return a.coordinate <= b.coordinate; else return a.begin > b.begin; } int main() { ll n, m, color, begin, end; cin >> n >> m; vector<Point> points; vector<ll> colors; colors.push_back(0); colors.push_back(0); colors.push_back(0); int ll result = 0; while(m--) { cin >> begin >> end >> color; Point point1, point2; point1.coordinate = begin; point1.color = color; point1.begin = true; point2.coordinate = end; point2.color = color; point2.begin = false; points.push_back(point1); points.push_back(point2); } sort(points.begin(), points.end(), compareByCoordinate); int i = 0; if(points.size() == 1){ cout << 0; return 0; }else{ if(points[i].color == 1) colors[0]++; else if(points[i].color == 2) colors[1]++; else colors[2]++; } i = 0; while(i + 1 < points.size()) { bool moved = false; do { if(points[i + 1].begin) { if (points[i + 1].color == 1) colors[0]++; else if (points[i + 1].color == 2) colors[1]++; else colors[2]++; i++; moved = true; } }while(i + 1 < points.size() && points[i + 1].begin && points[i+1].coordinate == points[i].coordinate); if(colors[0] >= 1 && colors[1] >= 1 && colors[2] == 0) { result++; } do { if(!points[i + 1].begin) { if (points[i + 1].color == 1) colors[0]--; else if (points[i + 1].color == 2) colors[1]--; else colors[2]--; i++; moved = true; } } while(i + 1< points.size() && !points[i + 1].begin && points[i+1].coordinate == points[i].coordinate); if(!moved) i++; } cout << result; }
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 <iostream> #include <bits/stdc++.h> #define ll long long #define ld long double #define pii pair<int,int> #define pll pair<ll,ll> #define fi first #define se second using namespace std; struct Point{ int coordinate; int color; bool begin; }; bool compareByCoordinate(const Point &a, const Point &b) { if(a.coordinate != b.coordinate) return a.coordinate <= b.coordinate; else return a.begin > b.begin; } int main() { ll n, m, color, begin, end; cin >> n >> m; vector<Point> points; vector<ll> colors; colors.push_back(0); colors.push_back(0); colors.push_back(0); int ll result = 0; while(m--) { cin >> begin >> end >> color; Point point1, point2; point1.coordinate = begin; point1.color = color; point1.begin = true; point2.coordinate = end; point2.color = color; point2.begin = false; points.push_back(point1); points.push_back(point2); } sort(points.begin(), points.end(), compareByCoordinate); int i = 0; if(points.size() == 1){ cout << 0; return 0; }else{ if(points[i].color == 1) colors[0]++; else if(points[i].color == 2) colors[1]++; else colors[2]++; } i = 0; while(i + 1 < points.size()) { bool moved = false; do { if(points[i + 1].begin) { if (points[i + 1].color == 1) colors[0]++; else if (points[i + 1].color == 2) colors[1]++; else colors[2]++; i++; moved = true; } }while(i + 1 < points.size() && points[i + 1].begin && points[i+1].coordinate == points[i].coordinate); if(colors[0] >= 1 && colors[1] >= 1 && colors[2] == 0) { result++; } do { if(!points[i + 1].begin) { if (points[i + 1].color == 1) colors[0]--; else if (points[i + 1].color == 2) colors[1]--; else colors[2]--; i++; moved = true; } } while(i + 1< points.size() && !points[i + 1].begin && points[i+1].coordinate == points[i].coordinate); if(!moved) i++; } cout << result; } |