// Michal Orawiec // Szeregowanie #include <cstdio> #include <set> #include <vector> #include <queue> #include <algorithm> using namespace std; const int MAX_N = 105; const int MAX_C = 1000 * 1000 + 7; int n, m; int akt; struct proces { int p; int k; int c; int ileDalismy; bool operator<(const proces &b) const { return p < b.p; } } tab[MAX_N]; bool cmp2(const int &a, const int &b) { return (tab[a].k - akt) - tab[a].c + tab[a].ileDalismy > (tab[b].k - akt) - tab[b].c + tab[b].ileDalismy; } struct cmp3 { bool operator()(const int &a, const int &b) const { return tab[a].k < tab[b].k; } }; int main() { bool zle = false; int pos = 0; scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) { scanf("%d%d%d", &tab[i].p, &tab[i].k, &tab[i].c); } sort(tab, tab + n); multiset<int, cmp3> aktualne; for (int i = 0; i < 1000 * 1000; i++) { while (pos < n && tab[pos].p <= i) aktualne.insert(pos++); akt = i; vector<int> kopiec; for (set<int>::iterator it = aktualne.begin(); it != aktualne.end(); it++) if (tab[*it].ileDalismy < tab[*it].c) kopiec.push_back(*it); if (!kopiec.empty()) sort(kopiec.begin(), kopiec.end(), cmp2); int z = 0; while (!kopiec.empty() && z < m) { if (tab[kopiec.back()].ileDalismy < tab[kopiec.back()].c && z < m) { int w = kopiec.back(); kopiec.pop_back(); tab[w].ileDalismy++; z++; } else kopiec.pop_back(); } while (!aktualne.empty() && tab[*aktualne.begin()].k <= i + 1) aktualne.erase(aktualne.begin()); } for (int i = 0; i < n; i++) if (tab[i].ileDalismy < tab[i].c) { printf("NIE\n"); zle = true; break; } if (!zle) printf("TAK\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 | // Michal Orawiec // Szeregowanie #include <cstdio> #include <set> #include <vector> #include <queue> #include <algorithm> using namespace std; const int MAX_N = 105; const int MAX_C = 1000 * 1000 + 7; int n, m; int akt; struct proces { int p; int k; int c; int ileDalismy; bool operator<(const proces &b) const { return p < b.p; } } tab[MAX_N]; bool cmp2(const int &a, const int &b) { return (tab[a].k - akt) - tab[a].c + tab[a].ileDalismy > (tab[b].k - akt) - tab[b].c + tab[b].ileDalismy; } struct cmp3 { bool operator()(const int &a, const int &b) const { return tab[a].k < tab[b].k; } }; int main() { bool zle = false; int pos = 0; scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) { scanf("%d%d%d", &tab[i].p, &tab[i].k, &tab[i].c); } sort(tab, tab + n); multiset<int, cmp3> aktualne; for (int i = 0; i < 1000 * 1000; i++) { while (pos < n && tab[pos].p <= i) aktualne.insert(pos++); akt = i; vector<int> kopiec; for (set<int>::iterator it = aktualne.begin(); it != aktualne.end(); it++) if (tab[*it].ileDalismy < tab[*it].c) kopiec.push_back(*it); if (!kopiec.empty()) sort(kopiec.begin(), kopiec.end(), cmp2); int z = 0; while (!kopiec.empty() && z < m) { if (tab[kopiec.back()].ileDalismy < tab[kopiec.back()].c && z < m) { int w = kopiec.back(); kopiec.pop_back(); tab[w].ileDalismy++; z++; } else kopiec.pop_back(); } while (!aktualne.empty() && tab[*aktualne.begin()].k <= i + 1) aktualne.erase(aktualne.begin()); } for (int i = 0; i < n; i++) if (tab[i].ileDalismy < tab[i].c) { printf("NIE\n"); zle = true; break; } if (!zle) printf("TAK\n"); return 0; } |