#include <bits/stdc++.h> using namespace std; //poczatek, dlugosc vector <pair <int, int> > ky[3]; //0 - zolty //1 - niebieski //2 - czerwony int n, m; //void wypisz() //{ // for(int i = 0; i < 3; i++) // { // cout << "ky: " << i << ": "; // for(int j = 0; j < ky[i].size(); j++) // { // cout << ky[i][j].first << " " << ky[i][j].second << " - "; // } // cout << endl; // } //} void dolacz(int lewa, int dlugosc, int k) { if(ky[k].size() == 0) { ky[k].push_back(make_pair(lewa, dlugosc)); } else { int l = 0, r = ky[k].size() - 1, m = 0; while(l != r) { m = (l + r) / 2; if(ky[k][m].first >= lewa) { r = m; } else { l = m + 1; } } if(ky[k][l].first == lewa) { ky[k][l].second = max(ky[k][l].second, dlugosc); } else if(ky[k][l].first < lewa) { ky[k].insert(ky[k].begin() + l + 1,make_pair(lewa, dlugosc)); } else if(ky[k][l].first > lewa) { ky[k].insert(ky[k].begin() + l, make_pair(lewa, dlugosc)); } } //wypisz(); } void policz() { int wynik = 0; int kon[3]; int j[3]; for(int i = 0; i < 3; i++) { kon[i] = 0; j[i] = 0; } for(int i = 1; i <= n; i++) { for(int k = 0; k < 3; k++) { while(j[k] < ky[k].size() && ky[k][j[k]].first <= i) { kon[k] = ky[k][j[k]].first + ky[k][j[k]].second; j[k]++; } } if(kon[0] >= i && kon[1] >= i && !(kon[2] >= i)) { wynik++; } } cout << wynik; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; int l, r, kolor; for(int i = 0; i < m; i++) { cin >> l >> r >> kolor; r = r - l; dolacz(l, r, kolor - 1); } policz(); }
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 | #include <bits/stdc++.h> using namespace std; //poczatek, dlugosc vector <pair <int, int> > ky[3]; //0 - zolty //1 - niebieski //2 - czerwony int n, m; //void wypisz() //{ // for(int i = 0; i < 3; i++) // { // cout << "ky: " << i << ": "; // for(int j = 0; j < ky[i].size(); j++) // { // cout << ky[i][j].first << " " << ky[i][j].second << " - "; // } // cout << endl; // } //} void dolacz(int lewa, int dlugosc, int k) { if(ky[k].size() == 0) { ky[k].push_back(make_pair(lewa, dlugosc)); } else { int l = 0, r = ky[k].size() - 1, m = 0; while(l != r) { m = (l + r) / 2; if(ky[k][m].first >= lewa) { r = m; } else { l = m + 1; } } if(ky[k][l].first == lewa) { ky[k][l].second = max(ky[k][l].second, dlugosc); } else if(ky[k][l].first < lewa) { ky[k].insert(ky[k].begin() + l + 1,make_pair(lewa, dlugosc)); } else if(ky[k][l].first > lewa) { ky[k].insert(ky[k].begin() + l, make_pair(lewa, dlugosc)); } } //wypisz(); } void policz() { int wynik = 0; int kon[3]; int j[3]; for(int i = 0; i < 3; i++) { kon[i] = 0; j[i] = 0; } for(int i = 1; i <= n; i++) { for(int k = 0; k < 3; k++) { while(j[k] < ky[k].size() && ky[k][j[k]].first <= i) { kon[k] = ky[k][j[k]].first + ky[k][j[k]].second; j[k]++; } } if(kon[0] >= i && kon[1] >= i && !(kon[2] >= i)) { wynik++; } } cout << wynik; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; int l, r, kolor; for(int i = 0; i < m; i++) { cin >> l >> r >> kolor; r = r - l; dolacz(l, r, kolor - 1); } policz(); } |