#include <bits/stdc++.h>
using namespace std;
int turn = 1000001;
struct Task {
Task(int s, int f, int l) : start(s), finish(f), len(l) {}
int start;
int finish;
int len;
};
bool cmp3(const Task& a, const Task& b) {
return a.start < b.start;
}
bool cmp2(const Task& a, const Task& b) {
return a.finish < b.finish;
}
int space_left(const Task& a) {
return a.finish - turn - a.len;
}
bool cmp(const Task& a, const Task& b) {
return space_left(a) < space_left(b);
}
int main() {
int n, m;
cin >> n >> m;
vector<Task> input;
for (int i = 0; i < n; i++) {
int s, f, l;
cin >> s >> f >> l;
turn = min(turn, s);
input.push_back(Task(s, f, l));
}
sort(input.begin(), input.end(), cmp3);
vector<Task> todo;
vector<Task> current;
int in = 0;
bool ret = true;
while (ret) {
while (in < input.size() && turn == input[in].start) {
current.push_back(input[in]);
in++;
}
sort(current.begin(), current.end(), cmp2);
int step = in < input.size() ? input[in].start - turn : 1000001;
for (int i = 0; i < current.size(); i++) {
step = min(step, current[i].len);
if (space_left(current[i]) == 0) {
todo.push_back(current[i]);
current.erase(current.begin() + i);
--i;
continue;
}
if (space_left(current[i]) < 0) {
ret = false;
}
}
for (int i = 0; i < todo.size(); i++) {
step = min(step, todo[i].len);
if (space_left(todo[i]) < 0) {
ret = false;
}
}
for (int i = m - todo.size(); i < current.size(); i++) {
step = min(step, space_left(current[i]));
}
int k = m;
if (todo.size() > m) ret = false;
for (int i = 0; i < todo.size(); i++) {
todo[i].len -= step;
k--;
}
for (int i = 0; i < todo.size(); i++) {
if (todo[i].len == 0) {
if (todo[i].finish < turn) ret = false;
todo.erase(todo.begin() + i);
i--;
}
}
for (int i = 0; i < current.size() || k == 0; i++) {
current[i].len -= step;
k--;
}
for (int i = 0; i < current.size(); i++) {
if (current[i].len == 0) {
if (current[i].finish < turn) ret = false;
current.erase(current.begin() + i);
i--;
}
}
turn += step;
if (in == input.size() && todo.empty() && current.empty()) {
break;
}
}
if (ret) cout << "TAK" << endl;
else cout << "NIE" << endl;
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 | #include <bits/stdc++.h> using namespace std; int turn = 1000001; struct Task { Task(int s, int f, int l) : start(s), finish(f), len(l) {} int start; int finish; int len; }; bool cmp3(const Task& a, const Task& b) { return a.start < b.start; } bool cmp2(const Task& a, const Task& b) { return a.finish < b.finish; } int space_left(const Task& a) { return a.finish - turn - a.len; } bool cmp(const Task& a, const Task& b) { return space_left(a) < space_left(b); } int main() { int n, m; cin >> n >> m; vector<Task> input; for (int i = 0; i < n; i++) { int s, f, l; cin >> s >> f >> l; turn = min(turn, s); input.push_back(Task(s, f, l)); } sort(input.begin(), input.end(), cmp3); vector<Task> todo; vector<Task> current; int in = 0; bool ret = true; while (ret) { while (in < input.size() && turn == input[in].start) { current.push_back(input[in]); in++; } sort(current.begin(), current.end(), cmp2); int step = in < input.size() ? input[in].start - turn : 1000001; for (int i = 0; i < current.size(); i++) { step = min(step, current[i].len); if (space_left(current[i]) == 0) { todo.push_back(current[i]); current.erase(current.begin() + i); --i; continue; } if (space_left(current[i]) < 0) { ret = false; } } for (int i = 0; i < todo.size(); i++) { step = min(step, todo[i].len); if (space_left(todo[i]) < 0) { ret = false; } } for (int i = m - todo.size(); i < current.size(); i++) { step = min(step, space_left(current[i])); } int k = m; if (todo.size() > m) ret = false; for (int i = 0; i < todo.size(); i++) { todo[i].len -= step; k--; } for (int i = 0; i < todo.size(); i++) { if (todo[i].len == 0) { if (todo[i].finish < turn) ret = false; todo.erase(todo.begin() + i); i--; } } for (int i = 0; i < current.size() || k == 0; i++) { current[i].len -= step; k--; } for (int i = 0; i < current.size(); i++) { if (current[i].len == 0) { if (current[i].finish < turn) ret = false; current.erase(current.begin() + i); i--; } } turn += step; if (in == input.size() && todo.empty() && current.empty()) { break; } } if (ret) cout << "TAK" << endl; else cout << "NIE" << endl; return 0; } |
English