#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
#define M 100005
long long D[M];
long long A[M];
long long B[M];
class BalanceComparator {
public:
bool operator() (const int& a, const int& b) {
if (D[a] == 0) return false;
if (D[b] == 0) return true;
return (B[a] * D[b]) < (B[b] * D[a]);
}
};
class DamageComparator {
public:
bool operator() (const int& a, const int& b) {
return D[a] > D[b];
}
} dmgcmp;
int main() {
long long z;
int n;
scanf("%d%lld",&n,&z);
vector<int> strongs;
vector<int> solution;
priority_queue<int, vector<int>, BalanceComparator> weaks;
for (int i = 0; i < n; i++) {
scanf("%lld%lld", &D[i], &A[i]); B[i] = A[i] - D[i];
}
for (int i = 0; i < n; i++) {
if (D[i] < z || D[i] == 0) weaks.push(i);
else strongs.push_back(i);
}
sort(strongs.begin(), strongs.end(), dmgcmp);
//for (vector<int> :: iterator it = strongs.begin(); it != strongs.end(); it++) printf("%lld %lld\n", D[*it], A[*it]);
bool omg = true;
while (!weaks.empty()) {
int top = weaks.top(); weaks.pop();
// printf("monster nr %d: %lld %lld with balance %lld/%lld\n", top+1, D[top], A[top], B[top], D[top]);
if (z <= D[top] && D[top] != 0) omg = false;
z += B[top];
solution.push_back(top);
//printf("mam hp: %lld\n", z);
//printf("strongs size: %d\n", strongs.size());
//printf("strongs back: %lld %lld\n", D[strongs.back()], A[strongs.back()]);
while (!strongs.empty() && D[strongs.back()] < z) {
int back = strongs.back();
//printf("dodaje %lld %lld\n", D[back], A[back]);
weaks.push(back);
strongs.pop_back();
}
}
if (weaks.empty() && strongs.empty() && omg) {
printf("TAK\n");
for (vector<int> :: iterator it = solution.begin(); it != solution.end(); it++) {
printf("%d ", *it + 1);
}
printf("\n");
} else {
printf("NIE\n");
}
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 | #include <cstdio> #include <vector> #include <algorithm> #include <queue> using namespace std; #define M 100005 long long D[M]; long long A[M]; long long B[M]; class BalanceComparator { public: bool operator() (const int& a, const int& b) { if (D[a] == 0) return false; if (D[b] == 0) return true; return (B[a] * D[b]) < (B[b] * D[a]); } }; class DamageComparator { public: bool operator() (const int& a, const int& b) { return D[a] > D[b]; } } dmgcmp; int main() { long long z; int n; scanf("%d%lld",&n,&z); vector<int> strongs; vector<int> solution; priority_queue<int, vector<int>, BalanceComparator> weaks; for (int i = 0; i < n; i++) { scanf("%lld%lld", &D[i], &A[i]); B[i] = A[i] - D[i]; } for (int i = 0; i < n; i++) { if (D[i] < z || D[i] == 0) weaks.push(i); else strongs.push_back(i); } sort(strongs.begin(), strongs.end(), dmgcmp); //for (vector<int> :: iterator it = strongs.begin(); it != strongs.end(); it++) printf("%lld %lld\n", D[*it], A[*it]); bool omg = true; while (!weaks.empty()) { int top = weaks.top(); weaks.pop(); // printf("monster nr %d: %lld %lld with balance %lld/%lld\n", top+1, D[top], A[top], B[top], D[top]); if (z <= D[top] && D[top] != 0) omg = false; z += B[top]; solution.push_back(top); //printf("mam hp: %lld\n", z); //printf("strongs size: %d\n", strongs.size()); //printf("strongs back: %lld %lld\n", D[strongs.back()], A[strongs.back()]); while (!strongs.empty() && D[strongs.back()] < z) { int back = strongs.back(); //printf("dodaje %lld %lld\n", D[back], A[back]); weaks.push(back); strongs.pop_back(); } } if (weaks.empty() && strongs.empty() && omg) { printf("TAK\n"); for (vector<int> :: iterator it = solution.begin(); it != solution.end(); it++) { printf("%d ", *it + 1); } printf("\n"); } else { printf("NIE\n"); } return 0; } |
English