#include <bits/stdc++.h> using namespace std; struct pending_task { int needed_time; int end_before; inline bool operator<(const pending_task& other) const { return (end_before - needed_time) < (other.end_before - other.needed_time); } }; struct running_task { int started_time; int needed_time; int end_before; }; void no() { cout << "NIE" << endl; exit(0); } template <typename T> inline void choose_first_n(vector<T>& v, int n) { if (n >= v.size()) { return; } auto nth = v.begin() + n; nth_element(v.begin(), nth, v.end()); auto next = nth + 1; while (next != v.end() && *nth < *next) next++; for (auto it = v.begin(); it != nth; it++) { if (*nth < *it) { swap(*it, *next); next++; while (next != v.end() && *nth < *next) next++; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector<vector<pending_task>> pending_tasks(1000001); for (int i = 0; i < n; i++) { int p, k, c; cin >> p >> k >> c; pending_task pt = { c, k }; pending_tasks[p].push_back(pt); } vector<pending_task> waiting_tasks; vector<running_task> running_tasks; waiting_tasks.reserve(105); running_tasks.reserve(105); for (int cur_second = 0; cur_second <= 1000000; cur_second++) { for (const auto& rt: running_tasks) { if (rt.started_time + rt.needed_time > cur_second) { pending_task pt = { rt.needed_time - (cur_second - rt.started_time), rt.end_before }; waiting_tasks.push_back(pt); } } running_tasks.clear(); for (const auto& pt: pending_tasks[cur_second]) { waiting_tasks.push_back(pt); } choose_first_n(waiting_tasks, m); for (int i = 0, mn = min(m, int(waiting_tasks.size())); i < mn; i++) { const pending_task& pt = waiting_tasks[i]; if (cur_second + pt.needed_time > pt.end_before) { no(); } running_task rt = { cur_second, pt.needed_time, pt.end_before }; running_tasks.push_back(rt); } if (int(waiting_tasks.size()) <= m) { waiting_tasks.clear(); } else { for (int i = 0; i < m; i++) { swap(waiting_tasks[i], waiting_tasks[waiting_tasks.size() - 1 - i]); } waiting_tasks.resize(max(0, int(waiting_tasks.size()) - m)); } } if (waiting_tasks.size()) { no(); } cout << "TAK" << endl; }
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 | #include <bits/stdc++.h> using namespace std; struct pending_task { int needed_time; int end_before; inline bool operator<(const pending_task& other) const { return (end_before - needed_time) < (other.end_before - other.needed_time); } }; struct running_task { int started_time; int needed_time; int end_before; }; void no() { cout << "NIE" << endl; exit(0); } template <typename T> inline void choose_first_n(vector<T>& v, int n) { if (n >= v.size()) { return; } auto nth = v.begin() + n; nth_element(v.begin(), nth, v.end()); auto next = nth + 1; while (next != v.end() && *nth < *next) next++; for (auto it = v.begin(); it != nth; it++) { if (*nth < *it) { swap(*it, *next); next++; while (next != v.end() && *nth < *next) next++; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector<vector<pending_task>> pending_tasks(1000001); for (int i = 0; i < n; i++) { int p, k, c; cin >> p >> k >> c; pending_task pt = { c, k }; pending_tasks[p].push_back(pt); } vector<pending_task> waiting_tasks; vector<running_task> running_tasks; waiting_tasks.reserve(105); running_tasks.reserve(105); for (int cur_second = 0; cur_second <= 1000000; cur_second++) { for (const auto& rt: running_tasks) { if (rt.started_time + rt.needed_time > cur_second) { pending_task pt = { rt.needed_time - (cur_second - rt.started_time), rt.end_before }; waiting_tasks.push_back(pt); } } running_tasks.clear(); for (const auto& pt: pending_tasks[cur_second]) { waiting_tasks.push_back(pt); } choose_first_n(waiting_tasks, m); for (int i = 0, mn = min(m, int(waiting_tasks.size())); i < mn; i++) { const pending_task& pt = waiting_tasks[i]; if (cur_second + pt.needed_time > pt.end_before) { no(); } running_task rt = { cur_second, pt.needed_time, pt.end_before }; running_tasks.push_back(rt); } if (int(waiting_tasks.size()) <= m) { waiting_tasks.clear(); } else { for (int i = 0; i < m; i++) { swap(waiting_tasks[i], waiting_tasks[waiting_tasks.size() - 1 - i]); } waiting_tasks.resize(max(0, int(waiting_tasks.size()) - m)); } } if (waiting_tasks.size()) { no(); } cout << "TAK" << endl; } |