#include <iostream> #include <vector> #include <algorithm> using namespace std; struct zmiana { int pozycja; bool koniec; short int kolor; zmiana(int a, bool b, short int c) { pozycja = a; koniec = b; kolor = c; } }; int n, m, licznik = 0, l, r, poczatek; short int k; vector<zmiana> v; int stan[4]; int previous = 0; bool cmp(zmiana& j, zmiana& d) { if (j.pozycja < d.pozycja) { return true; } if (j.pozycja > d.pozycja) { return false; } if (j.koniec == true && d.koniec == false) { return false; } if (j.koniec == false && d.koniec == true) { return true; } if (j.koniec == d.koniec && j.kolor == 3 && j.koniec == false) { return true; } return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; while (m--) { cin >> l >> r >> k; v.emplace_back(l, false, k); v.emplace_back(r, true, k); } sort(v.begin(), v.end(), cmp); for (zmiana& i : v) { if (i.koniec) { stan[i.kolor] -= 1; } else { stan[i.kolor] += 1; } if (stan[1] > 0 && stan[2] > 0 && stan[3] < 1) { stan[0] = 1; } else { stan[0] = 0; } if (previous > 0 && stan[0] < 1) { if (i.kolor == 3) { licznik += i.pozycja - poczatek; } else { licznik += i.pozycja - poczatek + 1; } } if (stan[0] > 0 && previous < 1) { poczatek = i.pozycja; if (i.kolor == 3) { poczatek++; } } previous = stan[0]; } cout << licznik << '\n'; 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 | #include <iostream> #include <vector> #include <algorithm> using namespace std; struct zmiana { int pozycja; bool koniec; short int kolor; zmiana(int a, bool b, short int c) { pozycja = a; koniec = b; kolor = c; } }; int n, m, licznik = 0, l, r, poczatek; short int k; vector<zmiana> v; int stan[4]; int previous = 0; bool cmp(zmiana& j, zmiana& d) { if (j.pozycja < d.pozycja) { return true; } if (j.pozycja > d.pozycja) { return false; } if (j.koniec == true && d.koniec == false) { return false; } if (j.koniec == false && d.koniec == true) { return true; } if (j.koniec == d.koniec && j.kolor == 3 && j.koniec == false) { return true; } return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; while (m--) { cin >> l >> r >> k; v.emplace_back(l, false, k); v.emplace_back(r, true, k); } sort(v.begin(), v.end(), cmp); for (zmiana& i : v) { if (i.koniec) { stan[i.kolor] -= 1; } else { stan[i.kolor] += 1; } if (stan[1] > 0 && stan[2] > 0 && stan[3] < 1) { stan[0] = 1; } else { stan[0] = 0; } if (previous > 0 && stan[0] < 1) { if (i.kolor == 3) { licznik += i.pozycja - poczatek; } else { licznik += i.pozycja - poczatek + 1; } } if (stan[0] > 0 && previous < 1) { poczatek = i.pozycja; if (i.kolor == 3) { poczatek++; } } previous = stan[0]; } cout << licznik << '\n'; return 0; } |