#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Procesik { int p; int k; int z; Procesik(int p, int k, int z) : p(p) , k(k) , z(z) {} bool operator<(const Procesik& p2) const{ return k - z < p2.k - p2.z; } }; int l, j, k, m, n; vector<Procesik> pv; vector<Procesik> actives; bool funkcj(const Procesik& p1, const Procesik& p2){ return p1.p < p2.p; } void pp(Procesik p1, int i){ cout << p1.p << " " << p1.k << " " << p1.z << " (" << p1.k - i + 1 - p1.z << ")" << endl; } int main() { cin >> n >> m; int pmin = 1000001; int kmax = -1; for(int i = 0; i < n; ++i){ cin >> l >> j >> k; j -= 1; if(l < pmin){ pmin = l; } if(j > kmax){ kmax = j; } pv.push_back(Procesik(l, j, k)); } sort(pv.begin(), pv.end(), funkcj); int pidx = 0; // cout << "MIN/MAX:" << endl; // cout << pmin << " " << kmax << endl; for(int i = pmin; i <= kmax; ++i){ // cout << "BEFORE MOMENT " << i << endl; while(true){ if(pidx < n && pv[pidx].p <= i){ actives.push_back(pv[pidx]); ++pidx; }else{ break; } } sort(actives.begin(), actives.end()); // cout << "ACTIVE PROCESSES:" << endl; // for(int j = 0; j < int(actives.size()); ++j){ // pp(actives[j], i); // } int posbs = min(int(actives.size()), m); // cout << "CAN EXECUTE " << posbs << endl; if(int(actives.size()) > posbs){ if(actives[posbs].z > actives[posbs].k - i + 1){ cout << "NIE" << endl; return 0; } } for(int i = 0; i < posbs; ++i){ actives[i].z -= 1; if(actives[i].z == 0){ actives.erase(actives.begin() + i); i--; posbs--; } } } if(actives.size() > 0){ cout << "NIE" <<endl; return 0; } cout << "TAK" << endl; /* for(unsigned i = 0; i < pv.size(); ++i){ cout << pv[i].p << " " << pv[i].k << " " << pv[i].z << 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 | #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Procesik { int p; int k; int z; Procesik(int p, int k, int z) : p(p) , k(k) , z(z) {} bool operator<(const Procesik& p2) const{ return k - z < p2.k - p2.z; } }; int l, j, k, m, n; vector<Procesik> pv; vector<Procesik> actives; bool funkcj(const Procesik& p1, const Procesik& p2){ return p1.p < p2.p; } void pp(Procesik p1, int i){ cout << p1.p << " " << p1.k << " " << p1.z << " (" << p1.k - i + 1 - p1.z << ")" << endl; } int main() { cin >> n >> m; int pmin = 1000001; int kmax = -1; for(int i = 0; i < n; ++i){ cin >> l >> j >> k; j -= 1; if(l < pmin){ pmin = l; } if(j > kmax){ kmax = j; } pv.push_back(Procesik(l, j, k)); } sort(pv.begin(), pv.end(), funkcj); int pidx = 0; // cout << "MIN/MAX:" << endl; // cout << pmin << " " << kmax << endl; for(int i = pmin; i <= kmax; ++i){ // cout << "BEFORE MOMENT " << i << endl; while(true){ if(pidx < n && pv[pidx].p <= i){ actives.push_back(pv[pidx]); ++pidx; }else{ break; } } sort(actives.begin(), actives.end()); // cout << "ACTIVE PROCESSES:" << endl; // for(int j = 0; j < int(actives.size()); ++j){ // pp(actives[j], i); // } int posbs = min(int(actives.size()), m); // cout << "CAN EXECUTE " << posbs << endl; if(int(actives.size()) > posbs){ if(actives[posbs].z > actives[posbs].k - i + 1){ cout << "NIE" << endl; return 0; } } for(int i = 0; i < posbs; ++i){ actives[i].z -= 1; if(actives[i].z == 0){ actives.erase(actives.begin() + i); i--; posbs--; } } } if(actives.size() > 0){ cout << "NIE" <<endl; return 0; } cout << "TAK" << endl; /* for(unsigned i = 0; i < pv.size(); ++i){ cout << pv[i].p << " " << pv[i].k << " " << pv[i].z << endl; } */ return 0; } |