#include <iostream> #include <map> #include <vector> #include <utility> using namespace std; constexpr short White = 0; constexpr short Yellow = 1; constexpr short Blue = 2; constexpr short Red = 4; constexpr short Green = 3; class Range { public: Range() {} Range(const Range &) = default; Range(Range &&) = default; Range &operator=(const Range &) = default; Range &operator=(Range &&) = default; Range(const int &x, const int &y, const short &z) : b(x), e(y), c(z) {} int b, e; short c; }; int main() { int n, m, l, r, k; bool erase; cin >> n >> m; map<int, Range> x; x[1] = Range(1, n, White); vector<Range> toAdd; while (m--) { cin >> l >> r >> k; if (k == 3) k = Red; auto b = x.upper_bound(l); auto e = x.upper_bound(r); if (b != x.begin()) b--; for (auto it = b; it != e;) { erase = false; const Range i = it->second; if ((i.c | k) == i.c && i.c != 0) { it++; continue; } const Range ran(max(i.b, l), min(i.e, r), k | i.c); if (ran.b > ran.e) { it++; continue; } if (i.b < l) { it->second.e = l - 1; } if (i.e > r) { toAdd.push_back(Range(r + 1, i.e, i.c)); //Range *it = &toAdd.back(); //cout <<"add " << it->b << ' ' << it->e << ' ' << it->c << '\n'; } if (k != Red) { if (i.b == l) it->second = ran; else toAdd.push_back(ran); } else { if (i.b >= l) { //cout<<"erase " << it->second.b << ' ' << it->second.e << ' ' << it->second.c << '\n'; erase = true; } } if (erase) it = x.erase(it); else it++; for (const auto &i : toAdd) x.insert_or_assign(it, i.b, i); toAdd.clear(); } //for (const auto &i : x) // cout << i.second.b << ' ' << i.second.e << ' ' << i.second.c << '\n'; //cout << '\n'; b = x.begin(); auto last = b; b++; e = x.end(); for (auto it = b; it != e;) { erase = false; if (last->second.c == it->second.c && last->second.e == it->second.b) { last->second.e = it->second.e; erase = true; } else last = it; if (erase) it = x.erase(it); else it++; } } int c = 0; for (const auto &i : x) if (i.second.c == Green) c += i.second.e - i.second.b + 1; cout << c; 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 119 120 121 122 123 124 125 126 | #include <iostream> #include <map> #include <vector> #include <utility> using namespace std; constexpr short White = 0; constexpr short Yellow = 1; constexpr short Blue = 2; constexpr short Red = 4; constexpr short Green = 3; class Range { public: Range() {} Range(const Range &) = default; Range(Range &&) = default; Range &operator=(const Range &) = default; Range &operator=(Range &&) = default; Range(const int &x, const int &y, const short &z) : b(x), e(y), c(z) {} int b, e; short c; }; int main() { int n, m, l, r, k; bool erase; cin >> n >> m; map<int, Range> x; x[1] = Range(1, n, White); vector<Range> toAdd; while (m--) { cin >> l >> r >> k; if (k == 3) k = Red; auto b = x.upper_bound(l); auto e = x.upper_bound(r); if (b != x.begin()) b--; for (auto it = b; it != e;) { erase = false; const Range i = it->second; if ((i.c | k) == i.c && i.c != 0) { it++; continue; } const Range ran(max(i.b, l), min(i.e, r), k | i.c); if (ran.b > ran.e) { it++; continue; } if (i.b < l) { it->second.e = l - 1; } if (i.e > r) { toAdd.push_back(Range(r + 1, i.e, i.c)); //Range *it = &toAdd.back(); //cout <<"add " << it->b << ' ' << it->e << ' ' << it->c << '\n'; } if (k != Red) { if (i.b == l) it->second = ran; else toAdd.push_back(ran); } else { if (i.b >= l) { //cout<<"erase " << it->second.b << ' ' << it->second.e << ' ' << it->second.c << '\n'; erase = true; } } if (erase) it = x.erase(it); else it++; for (const auto &i : toAdd) x.insert_or_assign(it, i.b, i); toAdd.clear(); } //for (const auto &i : x) // cout << i.second.b << ' ' << i.second.e << ' ' << i.second.c << '\n'; //cout << '\n'; b = x.begin(); auto last = b; b++; e = x.end(); for (auto it = b; it != e;) { erase = false; if (last->second.c == it->second.c && last->second.e == it->second.b) { last->second.e = it->second.e; erase = true; } else last = it; if (erase) it = x.erase(it); else it++; } } int c = 0; for (const auto &i : x) if (i.second.c == Green) c += i.second.e - i.second.b + 1; cout << c; return 0; } |