#include <cstdio>
#include <queue>
#include <unordered_set>
#include <algorithm>
const int MILION = 2000000000;
int n,m;
int p,k,c;
int r;
struct task {
int start, end;
int time;
int gap;
int id;
};
task* sorted[200];
task T[200];
std::priority_queue<int, std::vector<int>, std::greater<int> > events;
std::unordered_set<int> running;
bool order(const task* a, const task* b) {
if(a->gap != b->gap) return a->gap < b->gap;
if(a->end != b->end) return a->end < b->end;
return a->time > b->time;
}
main() {
scanf("%d %d", &n, &m);
for(int i=0;i<n;i++) {
scanf("%d %d %d", &p, &k, &c);
T[i].start = p;
T[i].end = k;
T[i].time = c;
T[i].id = i;
events.push(p);
events.push(k);
sorted[i] = &T[i];
}
int last_event = -1;
while(!events.empty()) {
int event = events.top();
events.pop();
// printf("%d\n", event);
if(event == last_event) continue;
// printf("GO\n");
// for(int i=0;i<n;i++) {
// printf("%d %d %d %d\n", T[i].start, T[i].end, T[i].time, T[i].gap);
// }
int t = event - last_event;
for (const auto& r : running) {
T[r].time-=t;
}
running.clear();
r = 0;
last_event = event;
for(int i=0;i<n;i++) {
if(T[i].time == 0)
continue;
T[i].gap = T[i].end - event - T[i].time;
// printf("GAP: %d\n", T[i].gap);
if(T[i].gap < 0) {
printf("NIE\n");
return 0;
}
}
std::sort(sorted, sorted+n, order);
for(int i=0;i<n;i++) {
if (sorted[i]->time == 0 || sorted[i]->start > event)
continue;
if(r < m) {
running.insert(sorted[i]->id);
events.push(event+sorted[i]->time);
r++;
} else {
events.push(event+sorted[i]->gap); // when this task cannot wait anymore
}
}
}
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 | #include <cstdio> #include <queue> #include <unordered_set> #include <algorithm> const int MILION = 2000000000; int n,m; int p,k,c; int r; struct task { int start, end; int time; int gap; int id; }; task* sorted[200]; task T[200]; std::priority_queue<int, std::vector<int>, std::greater<int> > events; std::unordered_set<int> running; bool order(const task* a, const task* b) { if(a->gap != b->gap) return a->gap < b->gap; if(a->end != b->end) return a->end < b->end; return a->time > b->time; } main() { scanf("%d %d", &n, &m); for(int i=0;i<n;i++) { scanf("%d %d %d", &p, &k, &c); T[i].start = p; T[i].end = k; T[i].time = c; T[i].id = i; events.push(p); events.push(k); sorted[i] = &T[i]; } int last_event = -1; while(!events.empty()) { int event = events.top(); events.pop(); // printf("%d\n", event); if(event == last_event) continue; // printf("GO\n"); // for(int i=0;i<n;i++) { // printf("%d %d %d %d\n", T[i].start, T[i].end, T[i].time, T[i].gap); // } int t = event - last_event; for (const auto& r : running) { T[r].time-=t; } running.clear(); r = 0; last_event = event; for(int i=0;i<n;i++) { if(T[i].time == 0) continue; T[i].gap = T[i].end - event - T[i].time; // printf("GAP: %d\n", T[i].gap); if(T[i].gap < 0) { printf("NIE\n"); return 0; } } std::sort(sorted, sorted+n, order); for(int i=0;i<n;i++) { if (sorted[i]->time == 0 || sorted[i]->start > event) continue; if(r < m) { running.insert(sorted[i]->id); events.push(event+sorted[i]->time); r++; } else { events.push(event+sorted[i]->gap); // when this task cannot wait anymore } } } printf("TAK\n"); return 0; } |
English