#include <iostream> #include <vector> #include <set> #include <queue> #include <algorithm> using namespace std; int n, m; bool wynik; vector <int> P, C, K, Q; queue <int> T; struct cmp { bool operator () (const int &i, const int &j) { if(K[i] < K[j]) return true; if(K[j] < K[i]) return false; return (i < j); } }; struct cmp2 { bool operator () (const int &i, const int &j) { return (P[i] < P[j]); } } mycmp; set <int, cmp> S; set<int,cmp>::iterator it; int pamiec, wrzu; void wypluj (int z) { cout << "DLA " << z << endl << endl << "SET ="; for (it = S.begin(); it != S.end(); ++it){ cout << " " << *it; } cout << endl << "pamiec = " << pamiec << endl << endl; return; } int main() { cin >> n >> m; P.resize(n); C.resize(n); K.resize(n); Q.resize(n); for (int i = 0; i < n; i++) { cin >> P[i] >> K[i] >> C[i]; Q[i] = i; } sort(Q.begin(), Q.end(), mycmp); pamiec = 0; wrzu = 0; //cout << Q[0] << " " << Q[1] << endl; //cout << P[0] << " " << P[1] << endl; for (int i = 1; i <= 1000000; i++) { while (wrzu < n && P[Q[wrzu]] == i-1) { //cout << "wrzucam " << Q[wrzu] << " dla " << i << endl; S.insert(Q[wrzu]); wrzu ++; //wypluj(i); } pamiec += min(int(S.size()) + int(T.size()), m); //if (i == 2) //wypluj(i); while (!S.empty() && C[*S.begin()] <= pamiec) { pamiec -= C[*S.begin()]; T.push(K[*S.begin()]); //cout << "wyrzucam " << *S.begin() << " dla " << i << endl; S.erase(S.begin()); //wypluj(i); } while(!T.empty() && T.front() == i) T.pop(); //wypluj(i); if (!S.empty() && K[*S.begin()] <= i) { //cout << P[*S.begin()] << " " << K[*S.begin()] << " " << C[*S.begin()] << endl; cout << "NIE"; return 0; } } cout << "TAK"; 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 | #include <iostream> #include <vector> #include <set> #include <queue> #include <algorithm> using namespace std; int n, m; bool wynik; vector <int> P, C, K, Q; queue <int> T; struct cmp { bool operator () (const int &i, const int &j) { if(K[i] < K[j]) return true; if(K[j] < K[i]) return false; return (i < j); } }; struct cmp2 { bool operator () (const int &i, const int &j) { return (P[i] < P[j]); } } mycmp; set <int, cmp> S; set<int,cmp>::iterator it; int pamiec, wrzu; void wypluj (int z) { cout << "DLA " << z << endl << endl << "SET ="; for (it = S.begin(); it != S.end(); ++it){ cout << " " << *it; } cout << endl << "pamiec = " << pamiec << endl << endl; return; } int main() { cin >> n >> m; P.resize(n); C.resize(n); K.resize(n); Q.resize(n); for (int i = 0; i < n; i++) { cin >> P[i] >> K[i] >> C[i]; Q[i] = i; } sort(Q.begin(), Q.end(), mycmp); pamiec = 0; wrzu = 0; //cout << Q[0] << " " << Q[1] << endl; //cout << P[0] << " " << P[1] << endl; for (int i = 1; i <= 1000000; i++) { while (wrzu < n && P[Q[wrzu]] == i-1) { //cout << "wrzucam " << Q[wrzu] << " dla " << i << endl; S.insert(Q[wrzu]); wrzu ++; //wypluj(i); } pamiec += min(int(S.size()) + int(T.size()), m); //if (i == 2) //wypluj(i); while (!S.empty() && C[*S.begin()] <= pamiec) { pamiec -= C[*S.begin()]; T.push(K[*S.begin()]); //cout << "wyrzucam " << *S.begin() << " dla " << i << endl; S.erase(S.begin()); //wypluj(i); } while(!T.empty() && T.front() == i) T.pop(); //wypluj(i); if (!S.empty() && K[*S.begin()] <= i) { //cout << P[*S.begin()] << " " << K[*S.begin()] << " " << C[*S.begin()] << endl; cout << "NIE"; return 0; } } cout << "TAK"; return 0; } |