#ifdef _MSC_VER
#ifndef __GNUC__
#pragma warning(disable: 4996)
#endif
#define main main0
#endif
#include <algorithm>
#include <iostream>
using namespace std;
static const int MaxTasks = 100;
struct Task {
int start;
int stop;
int end;
Task() {}
Task(int start, int stop, int end): start(start), stop(stop), end(end) {}
};
bool SortByStart(const Task& lhs, const Task& rhs) {
if(lhs.start != rhs.start)
return lhs.start < rhs.start;
if(lhs.stop != rhs.stop)
return lhs.stop < rhs.stop;
return lhs.end < rhs.end;
}
bool SortByStop(const Task& lhs, const Task& rhs) {
if(lhs.stop != rhs.stop)
return lhs.stop < rhs.stop;
return lhs.end < rhs.end;
}
void ReadTasks(Task* tasks, int n) {
Task* endTasks = tasks + n;
for(Task* task = tasks; task < endTasks; ++task) {
int p, k, c;
cin >> p >> k >> c;
task->start = p;
task->stop = p + c;
task->end = k;
}
endTasks->start = 1111111;
endTasks->stop = 2222222;
endTasks->end = 3333333;
sort(tasks, endTasks, SortByStart);
}
bool DeleteTasks(Task* tasks, Task* task, Task** endTasks) {
Task* endDelete = tasks;
int time = task->start;
sort(tasks, task + 1, SortByStop);
while(endDelete->stop <= time)
++endDelete;
if(endDelete != tasks) {
while(endDelete < *endTasks)
*tasks++ = *endDelete++;
*endTasks = tasks;
return true;
}
return false;
}
bool ShiftTask(Task* tasks, Task* task, Task* endTasks) {
// sort(tasks, task + 1, SortByStop);
int time = 0;
for(Task* t = tasks; t <= task; ++t)
if(time < t->start)
time = t->start;
int shift0 = task[1].start - time; // start nie dalej niz start kolejnego zadania (m+1 zadanie)
for(Task* t = tasks; t <= task; ++t) {
int shift1 = t[1].stop - t->stop + 1; // nie dalej niz o 1 za kolejnym
int shift2 = t->end - t->stop; // nie dalej niz koniec pola tego zadania
if(shift2 > shift1)
shift2 = shift1;
if(shift2 > shift0)
shift2 = shift0;
if(shift2 <= 0)
continue;
t->start = time + shift0;
t->stop += shift0;
swap(*t, *task);
for(t = task; t < endTasks && SortByStop(t[1], *t); ++t)
swap(t[1], *t);
return true;
}
return false;
}
int main() {
ios_base::sync_with_stdio(0);
bool good = true;
Task tasks[MaxTasks+1];
int n, m;
cin >> n >> m;
if(n <= m) {
cout << "TAK" << endl;
return 0;
}
Task* endTasks = tasks + n;
Task* task = tasks + m;
ReadTasks(tasks, n);
for(; endTasks >= task; ) {
if(DeleteTasks(tasks, task, &endTasks))
continue;
if(!ShiftTask(tasks, task, endTasks)) {
cout << "NIE" << endl;
return 0;
}
}
cout << "TAK" << 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 115 116 | #ifdef _MSC_VER #ifndef __GNUC__ #pragma warning(disable: 4996) #endif #define main main0 #endif #include <algorithm> #include <iostream> using namespace std; static const int MaxTasks = 100; struct Task { int start; int stop; int end; Task() {} Task(int start, int stop, int end): start(start), stop(stop), end(end) {} }; bool SortByStart(const Task& lhs, const Task& rhs) { if(lhs.start != rhs.start) return lhs.start < rhs.start; if(lhs.stop != rhs.stop) return lhs.stop < rhs.stop; return lhs.end < rhs.end; } bool SortByStop(const Task& lhs, const Task& rhs) { if(lhs.stop != rhs.stop) return lhs.stop < rhs.stop; return lhs.end < rhs.end; } void ReadTasks(Task* tasks, int n) { Task* endTasks = tasks + n; for(Task* task = tasks; task < endTasks; ++task) { int p, k, c; cin >> p >> k >> c; task->start = p; task->stop = p + c; task->end = k; } endTasks->start = 1111111; endTasks->stop = 2222222; endTasks->end = 3333333; sort(tasks, endTasks, SortByStart); } bool DeleteTasks(Task* tasks, Task* task, Task** endTasks) { Task* endDelete = tasks; int time = task->start; sort(tasks, task + 1, SortByStop); while(endDelete->stop <= time) ++endDelete; if(endDelete != tasks) { while(endDelete < *endTasks) *tasks++ = *endDelete++; *endTasks = tasks; return true; } return false; } bool ShiftTask(Task* tasks, Task* task, Task* endTasks) { // sort(tasks, task + 1, SortByStop); int time = 0; for(Task* t = tasks; t <= task; ++t) if(time < t->start) time = t->start; int shift0 = task[1].start - time; // start nie dalej niz start kolejnego zadania (m+1 zadanie) for(Task* t = tasks; t <= task; ++t) { int shift1 = t[1].stop - t->stop + 1; // nie dalej niz o 1 za kolejnym int shift2 = t->end - t->stop; // nie dalej niz koniec pola tego zadania if(shift2 > shift1) shift2 = shift1; if(shift2 > shift0) shift2 = shift0; if(shift2 <= 0) continue; t->start = time + shift0; t->stop += shift0; swap(*t, *task); for(t = task; t < endTasks && SortByStop(t[1], *t); ++t) swap(t[1], *t); return true; } return false; } int main() { ios_base::sync_with_stdio(0); bool good = true; Task tasks[MaxTasks+1]; int n, m; cin >> n >> m; if(n <= m) { cout << "TAK" << endl; return 0; } Task* endTasks = tasks + n; Task* task = tasks + m; ReadTasks(tasks, n); for(; endTasks >= task; ) { if(DeleteTasks(tasks, task, &endTasks)) continue; if(!ShiftTask(tasks, task, endTasks)) { cout << "NIE" << endl; return 0; } } cout << "TAK" << endl; return 0; } |
English