#include<cstdio> #include<utility> #include<vector> #include<algorithm> typedef std::pair<int, int> pii; typedef std::vector<pii> v; int n, m; v yellow_events; v blue_events; v red_events; void input() { scanf("%d %d", &n, &m); int l, r, k; for (int i = 0; i < m; i++) { scanf("%d %d %d", &l, &r, &k); pii p = std::make_pair(l, r); if (k == 1) { yellow_events.push_back(p); } else if (k == 2) { blue_events.push_back(p); } else { red_events.push_back(p); } } } void print_v(v vec) { printf("%lu elements\n", vec.size()); for (v::iterator it = vec.begin(); it != vec.end(); ++it) { printf("%d %d\n", it -> first, it -> second); } } bool cmp_p(pii & p1, pii & p2) { if (p1.first < p2.first) { return true; } else if (p1.first == p2.first) { return p1.second < p2.second; } else { return false; } } void sort_v() { std::sort(yellow_events.begin(), yellow_events.end(), cmp_p); std::sort(blue_events.begin(), blue_events.end(), cmp_p); std::sort(red_events.begin(), red_events.end(), cmp_p); } void print_p(v::iterator & p, v & vec) { if (p == vec.end()) { printf("NULL\n"); } else { printf("(%d %d) ", p -> first, p -> second); } } v::iterator forward(v::iterator & current, v & vec, int i) { while (current != vec.end() && i > current -> second) { ++current; } // if (current == vec.end()) { // printf("END forward\n"); // } return current; } bool marked(v::iterator & current, v & vec, int i) { if (current == vec.end()) { return false; } return current -> first <= i && current -> second >= i; } int count() { v::iterator yellow = yellow_events.begin(); v::iterator blue = blue_events.begin(); v::iterator red = red_events.begin(); int result = 0; for (int i = 1; i <= n; i++) { yellow = forward(yellow, yellow_events, i); blue = forward(blue, blue_events, i); red = forward(red, red_events, i); // printf("i = %d ", i); // print_p(yellow, yellow_events); // print_p(blue, blue_events); // print_p(red, red_events); // printf("\n"); if (marked(yellow, yellow_events, i) && marked(blue, blue_events, i) && !marked(red, red_events, i)) { ++result; } } return result; } int main() { input(); sort_v(); // printf("yellow\n"); // print_v(yellow_events); // printf("\nblue\n"); // print_v(blue_events); // printf("\nred\n"); // print_v(red_events); printf("%d\n", count()); 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 112 113 114 115 116 117 118 | #include<cstdio> #include<utility> #include<vector> #include<algorithm> typedef std::pair<int, int> pii; typedef std::vector<pii> v; int n, m; v yellow_events; v blue_events; v red_events; void input() { scanf("%d %d", &n, &m); int l, r, k; for (int i = 0; i < m; i++) { scanf("%d %d %d", &l, &r, &k); pii p = std::make_pair(l, r); if (k == 1) { yellow_events.push_back(p); } else if (k == 2) { blue_events.push_back(p); } else { red_events.push_back(p); } } } void print_v(v vec) { printf("%lu elements\n", vec.size()); for (v::iterator it = vec.begin(); it != vec.end(); ++it) { printf("%d %d\n", it -> first, it -> second); } } bool cmp_p(pii & p1, pii & p2) { if (p1.first < p2.first) { return true; } else if (p1.first == p2.first) { return p1.second < p2.second; } else { return false; } } void sort_v() { std::sort(yellow_events.begin(), yellow_events.end(), cmp_p); std::sort(blue_events.begin(), blue_events.end(), cmp_p); std::sort(red_events.begin(), red_events.end(), cmp_p); } void print_p(v::iterator & p, v & vec) { if (p == vec.end()) { printf("NULL\n"); } else { printf("(%d %d) ", p -> first, p -> second); } } v::iterator forward(v::iterator & current, v & vec, int i) { while (current != vec.end() && i > current -> second) { ++current; } // if (current == vec.end()) { // printf("END forward\n"); // } return current; } bool marked(v::iterator & current, v & vec, int i) { if (current == vec.end()) { return false; } return current -> first <= i && current -> second >= i; } int count() { v::iterator yellow = yellow_events.begin(); v::iterator blue = blue_events.begin(); v::iterator red = red_events.begin(); int result = 0; for (int i = 1; i <= n; i++) { yellow = forward(yellow, yellow_events, i); blue = forward(blue, blue_events, i); red = forward(red, red_events, i); // printf("i = %d ", i); // print_p(yellow, yellow_events); // print_p(blue, blue_events); // print_p(red, red_events); // printf("\n"); if (marked(yellow, yellow_events, i) && marked(blue, blue_events, i) && !marked(red, red_events, i)) { ++result; } } return result; } int main() { input(); sort_v(); // printf("yellow\n"); // print_v(yellow_events); // printf("\nblue\n"); // print_v(blue_events); // printf("\nred\n"); // print_v(red_events); printf("%d\n", count()); return 0; } |