#include <cstdio> #include <utility> #include <algorithm> using namespace std; long long hp; bool czy[100000]; int res[100000], n, a, b, p1, p2, pom1, pom2, j,l; pair < pair < int, int> , int> plusz[100000], minusz[100000]; int main() { scanf("%d%lld", &n, &hp); for (int i = 0; i < n; i++) { scanf("%d%d", &a, &b); b -= a; if (b >= 0) { plusz[p1] = make_pair(make_pair(a, b), i); p1++; } else { minusz[p2] = make_pair(make_pair(a, (-1)*b), i); p2++; } } sort(plusz, plusz + p1); for (int i = 0; i < p1; i++) { if (plusz[i].first.first >= hp) { printf("NIE"); return 0; } hp += plusz[i].first.second; res[i] = plusz[i].second; } l = p1; sort(minusz, minusz + p2); for (int i = p2 - 1; i >= 0; i--) { if (czy[i] == 0) { if (hp - minusz[i].first.first <= 0) { printf("NIE"); return 0; } if (i == 0) { res[l] = minusz[i].second; break; } if (hp - minusz[i].first.second > minusz[i-1].first.first) { hp -= minusz[i].first.second; res[l] = minusz[i].second; czy[i] = 1; l++; } else { j = i - 1; while (hp - minusz[i].first.second <= minusz[j].first.first) { hp -= minusz[j].first.second; if (hp <= minusz[i].first.first) { printf("NIE"); return 0; } res[l] = minusz[j].second; czy[j] = 1; l++; j--; if ( j < 0) { if (hp - minusz[i].first.first > 0) break; else { printf("NIE"); return 0; } } } res[l] = minusz[i].second; hp -= minusz[i].first.second; czy[i] = 1; l++; } } } printf("TAK \n"); for (int i = 0; i < n; i++) printf("%d ", res[i] + 1); 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 | #include <cstdio> #include <utility> #include <algorithm> using namespace std; long long hp; bool czy[100000]; int res[100000], n, a, b, p1, p2, pom1, pom2, j,l; pair < pair < int, int> , int> plusz[100000], minusz[100000]; int main() { scanf("%d%lld", &n, &hp); for (int i = 0; i < n; i++) { scanf("%d%d", &a, &b); b -= a; if (b >= 0) { plusz[p1] = make_pair(make_pair(a, b), i); p1++; } else { minusz[p2] = make_pair(make_pair(a, (-1)*b), i); p2++; } } sort(plusz, plusz + p1); for (int i = 0; i < p1; i++) { if (plusz[i].first.first >= hp) { printf("NIE"); return 0; } hp += plusz[i].first.second; res[i] = plusz[i].second; } l = p1; sort(minusz, minusz + p2); for (int i = p2 - 1; i >= 0; i--) { if (czy[i] == 0) { if (hp - minusz[i].first.first <= 0) { printf("NIE"); return 0; } if (i == 0) { res[l] = minusz[i].second; break; } if (hp - minusz[i].first.second > minusz[i-1].first.first) { hp -= minusz[i].first.second; res[l] = minusz[i].second; czy[i] = 1; l++; } else { j = i - 1; while (hp - minusz[i].first.second <= minusz[j].first.first) { hp -= minusz[j].first.second; if (hp <= minusz[i].first.first) { printf("NIE"); return 0; } res[l] = minusz[j].second; czy[j] = 1; l++; j--; if ( j < 0) { if (hp - minusz[i].first.first > 0) break; else { printf("NIE"); return 0; } } } res[l] = minusz[i].second; hp -= minusz[i].first.second; czy[i] = 1; l++; } } } printf("TAK \n"); for (int i = 0; i < n; i++) printf("%d ", res[i] + 1); return 0; } |