// zachlan #include <cstdio> #include <vector> #include <algorithm> #include <set> constexpr int MAXN = 101; constexpr int INF = 2147483647; int n, m; int end_time[MAXN]; int time_left[MAXN]; struct Event { int num; int time; bool start; Event(int num_, int time_, bool start_) : num(num_), time(time_), start(start_) {} Event() : Event(0, 0, false) {} bool operator<(const Event& other) const { if (time != other.time) { return time < other.time; } return num < other.num; } }; int curr_time = 0; int margin(int a) { return end_time[a] - curr_time - time_left[a]; } bool cmp(int a, int b) { int t1 = margin(a); int t2 = margin(b); if (t1 != t2) { return t1 < t2; } return a < b; } std::vector<int> ready_tasks; std::vector<Event> events; int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) { int st, en, time_req; scanf("%d%d%d", &st, &en, &time_req); end_time[i] = en; events.emplace_back(i, st, true); time_left[i] = time_req; } std::sort(events.begin(), events.end()); auto events_it = events.begin(); // for (auto& ev : events) { // printf("%d %d\n", ev.num, ev.time); // } bool ok = true; while (events_it != events.end() || !ready_tasks.empty()) { // printf("t = %d\n", curr_time); // for (int x : ready_tasks) { // printf("%d end %d left %d margin %d\n", x, end_time[x], time_left[x], margin(x)); // } // printf("------\n"); while (events_it != events.end() && events_it->time == curr_time) { ready_tasks.push_back(events_it->num); ++events_it; } int next_time = events_it == events.end() ? INF : events_it->time; for (int task_no : ready_tasks) { next_time = std::min(next_time, time_left[task_no] + curr_time); } if (ready_tasks.size() > m) { next_time = std::min(next_time, curr_time + std::max(1, margin(ready_tasks[m - 1]) - margin(ready_tasks[m]))); } std::sort(ready_tasks.begin(), ready_tasks.end(), cmp); // printf("next time %d\n", next_time); // for (int x : ready_tasks) { // printf("%d end %d left %d margin %d\n", x, end_time[x], time_left[x], margin(x)); // } // printf("------\n\n"); auto ready_it = ready_tasks.begin(); for (int i = 0; i < m && ready_it != ready_tasks.end(); ++i) { time_left[*ready_it] -= next_time - curr_time; ++ready_it; } curr_time = next_time; // printf("********\n"); // for (int x : ready_tasks) { // printf("%d end %d left %d margin %d\n", x, end_time[x], time_left[x], margin(x)); // } // printf("------\n\n\n"); for (int i = 0; i < ready_tasks.size(); ++i) { if (time_left[ready_tasks[i]] == 0) { if (curr_time > end_time[ready_tasks[i]]) { printf("NIE\n"); return 0; } std::swap(ready_tasks[i], ready_tasks[ready_tasks.size() - 1]); ready_tasks.pop_back(); } } } 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 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 127 | // zachlan #include <cstdio> #include <vector> #include <algorithm> #include <set> constexpr int MAXN = 101; constexpr int INF = 2147483647; int n, m; int end_time[MAXN]; int time_left[MAXN]; struct Event { int num; int time; bool start; Event(int num_, int time_, bool start_) : num(num_), time(time_), start(start_) {} Event() : Event(0, 0, false) {} bool operator<(const Event& other) const { if (time != other.time) { return time < other.time; } return num < other.num; } }; int curr_time = 0; int margin(int a) { return end_time[a] - curr_time - time_left[a]; } bool cmp(int a, int b) { int t1 = margin(a); int t2 = margin(b); if (t1 != t2) { return t1 < t2; } return a < b; } std::vector<int> ready_tasks; std::vector<Event> events; int main() { scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) { int st, en, time_req; scanf("%d%d%d", &st, &en, &time_req); end_time[i] = en; events.emplace_back(i, st, true); time_left[i] = time_req; } std::sort(events.begin(), events.end()); auto events_it = events.begin(); // for (auto& ev : events) { // printf("%d %d\n", ev.num, ev.time); // } bool ok = true; while (events_it != events.end() || !ready_tasks.empty()) { // printf("t = %d\n", curr_time); // for (int x : ready_tasks) { // printf("%d end %d left %d margin %d\n", x, end_time[x], time_left[x], margin(x)); // } // printf("------\n"); while (events_it != events.end() && events_it->time == curr_time) { ready_tasks.push_back(events_it->num); ++events_it; } int next_time = events_it == events.end() ? INF : events_it->time; for (int task_no : ready_tasks) { next_time = std::min(next_time, time_left[task_no] + curr_time); } if (ready_tasks.size() > m) { next_time = std::min(next_time, curr_time + std::max(1, margin(ready_tasks[m - 1]) - margin(ready_tasks[m]))); } std::sort(ready_tasks.begin(), ready_tasks.end(), cmp); // printf("next time %d\n", next_time); // for (int x : ready_tasks) { // printf("%d end %d left %d margin %d\n", x, end_time[x], time_left[x], margin(x)); // } // printf("------\n\n"); auto ready_it = ready_tasks.begin(); for (int i = 0; i < m && ready_it != ready_tasks.end(); ++i) { time_left[*ready_it] -= next_time - curr_time; ++ready_it; } curr_time = next_time; // printf("********\n"); // for (int x : ready_tasks) { // printf("%d end %d left %d margin %d\n", x, end_time[x], time_left[x], margin(x)); // } // printf("------\n\n\n"); for (int i = 0; i < ready_tasks.size(); ++i) { if (time_left[ready_tasks[i]] == 0) { if (curr_time > end_time[ready_tasks[i]]) { printf("NIE\n"); return 0; } std::swap(ready_tasks[i], ready_tasks[ready_tasks.size() - 1]); ready_tasks.pop_back(); } } } printf("TAK\n"); return 0; } |