#include <stdio.h> #define FOR(ii, ll, uu) for(int ii##lim = (uu), ii = (ll); ii < ii##lim; ++ii) #define REP(ii, nn) FOR(ii, 0, nn) // from stackoverflow #define getcx getchar_unlocked inline int giu() { int n = 0; int ch=getcx(); while (ch < '0' || ch > '9') { ch = getcx(); } while (ch >= '0' && ch <= '9') n = (n<<3)+(n<<1) + ch-'0', ch = getcx(); return n; } #define GI (giu()) #include <vector> #include <algorithm> using namespace std; typedef pair<int, int> PII; #define ST first #define ND second int main() { vector<PII> monsters; vector<PII> gains; vector<PII> losses; vector<int> order; int n = GI; long long z = GI; monsters.reserve(n); gains.reserve(n); losses.reserve(n); order.reserve(n); long long total_losses = 0; REP(i, n) { int di = GI, ai = GI; monsters.push_back(PII(di, ai)); if (di <= ai) { gains.push_back(PII(di, i)); } else { losses.push_back(PII(-ai, i)); total_losses += di - ai; } } sort(gains.begin(), gains.end()); REP(i, gains.size()) { PII& m = monsters[gains[i].ND]; if (m.ST >= z) { puts("NIE"); return 0; } z += m.ND - m.ST; order.push_back(gains[i].ND+1); } if (total_losses >= z) { puts("NIE"); return 0; } sort(losses.begin(), losses.end()); REP(i, losses.size()) { PII& m = monsters[losses[i].ND]; if (m.ST >= z) { puts("NIE"); return 0; } z += m.ND - m.ST; order.push_back(losses[i].ND+1); } puts("TAK"); printf("%d", order[0]); REP(i, n-1) { printf(" %d", order[i+1]); } puts(""); 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 | #include <stdio.h> #define FOR(ii, ll, uu) for(int ii##lim = (uu), ii = (ll); ii < ii##lim; ++ii) #define REP(ii, nn) FOR(ii, 0, nn) // from stackoverflow #define getcx getchar_unlocked inline int giu() { int n = 0; int ch=getcx(); while (ch < '0' || ch > '9') { ch = getcx(); } while (ch >= '0' && ch <= '9') n = (n<<3)+(n<<1) + ch-'0', ch = getcx(); return n; } #define GI (giu()) #include <vector> #include <algorithm> using namespace std; typedef pair<int, int> PII; #define ST first #define ND second int main() { vector<PII> monsters; vector<PII> gains; vector<PII> losses; vector<int> order; int n = GI; long long z = GI; monsters.reserve(n); gains.reserve(n); losses.reserve(n); order.reserve(n); long long total_losses = 0; REP(i, n) { int di = GI, ai = GI; monsters.push_back(PII(di, ai)); if (di <= ai) { gains.push_back(PII(di, i)); } else { losses.push_back(PII(-ai, i)); total_losses += di - ai; } } sort(gains.begin(), gains.end()); REP(i, gains.size()) { PII& m = monsters[gains[i].ND]; if (m.ST >= z) { puts("NIE"); return 0; } z += m.ND - m.ST; order.push_back(gains[i].ND+1); } if (total_losses >= z) { puts("NIE"); return 0; } sort(losses.begin(), losses.end()); REP(i, losses.size()) { PII& m = monsters[losses[i].ND]; if (m.ST >= z) { puts("NIE"); return 0; } z += m.ND - m.ST; order.push_back(losses[i].ND+1); } puts("TAK"); printf("%d", order[0]); REP(i, n-1) { printf(" %d", order[i+1]); } puts(""); return 0; } |