#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <deque>
#define getchar_custom getc_unlocked
char c;
template <typename T>
inline T read_custom() {
c = getchar_custom(stdin);
while (c<'0' || c>'9')
{
c = getchar_custom(stdin);
}
T returnValue = 0;
while (c >= '0' && c <= '9') {
returnValue = (returnValue << 3) + (returnValue << 1) + c - 48;
c = getchar_custom(stdin);
}
return returnValue;
}
struct monster {
int position;
int attack;
int bonus_att_diff;
};
struct monsterCmp {
bool operator()(monster const *a, monster const *b) {
return a->attack < b->attack;
};
};
int main() {
int monstersNo = read_custom<int>();
long long life = read_custom<long long>();
std::vector<monster*> monsters;
std::vector<int> max_diff;
for (int i = 1; i <= monstersNo; i++) {
monster *m = new monster;
m->position = i;
m->attack = read_custom<int>();
m->bonus_att_diff = read_custom<int>() - m->attack;
monsters.push_back(m);
}
std::make_heap(monsters.begin(), monsters.end(), monsterCmp());
std::sort_heap(monsters.begin(), monsters.end(), monsterCmp());
std::deque<monster*> battle;
while (monsters.size() > 0) {
int pos = 0;
while (pos < monsters.size() && monsters[pos]->attack < life && monsters[pos]->bonus_att_diff < 0) {
pos += 1;
}
if (pos == monsters.size() && (monsters[pos-1]->attack >= life)) {
std::cout << "NIE" << std::endl;
return 0;
}
else if (pos == monsters.size())
{
pos -= 1;
}
if (monsters[pos]->bonus_att_diff >= 0) {
if (monsters[pos]->attack == life) {
std::cout << "NIE" << std::endl;
return 0;
}
life += monsters[pos]->bonus_att_diff;
battle.push_back(monsters[pos]);
monsters.erase(monsters.begin() + pos);
continue;
}
if (monsters[pos]->attack >= life)
{
std::cout << "NIE" << std::endl;
return 0;
}
life += monsters[pos]->bonus_att_diff;
battle.push_back(monsters[pos]);
monsters.erase(monsters.begin() + pos);
}
if (life <= 0) {
std::cout << "NIE" << std::endl;
return 0;
}
std::cout << "TAK" << std::endl;
while (battle.size() > 0) {
monster *tmp = battle.front();
battle.pop_front();
std::cout << tmp->position;
if (battle.size() > 0) {
std::cout << " ";
}
}
}
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <cstdio> #include <iostream> #include <algorithm> #include <cstdlib> #include <vector> #include <deque> #define getchar_custom getc_unlocked char c; template <typename T> inline T read_custom() { c = getchar_custom(stdin); while (c<'0' || c>'9') { c = getchar_custom(stdin); } T returnValue = 0; while (c >= '0' && c <= '9') { returnValue = (returnValue << 3) + (returnValue << 1) + c - 48; c = getchar_custom(stdin); } return returnValue; } struct monster { int position; int attack; int bonus_att_diff; }; struct monsterCmp { bool operator()(monster const *a, monster const *b) { return a->attack < b->attack; }; }; int main() { int monstersNo = read_custom<int>(); long long life = read_custom<long long>(); std::vector<monster*> monsters; std::vector<int> max_diff; for (int i = 1; i <= monstersNo; i++) { monster *m = new monster; m->position = i; m->attack = read_custom<int>(); m->bonus_att_diff = read_custom<int>() - m->attack; monsters.push_back(m); } std::make_heap(monsters.begin(), monsters.end(), monsterCmp()); std::sort_heap(monsters.begin(), monsters.end(), monsterCmp()); std::deque<monster*> battle; while (monsters.size() > 0) { int pos = 0; while (pos < monsters.size() && monsters[pos]->attack < life && monsters[pos]->bonus_att_diff < 0) { pos += 1; } if (pos == monsters.size() && (monsters[pos-1]->attack >= life)) { std::cout << "NIE" << std::endl; return 0; } else if (pos == monsters.size()) { pos -= 1; } if (monsters[pos]->bonus_att_diff >= 0) { if (monsters[pos]->attack == life) { std::cout << "NIE" << std::endl; return 0; } life += monsters[pos]->bonus_att_diff; battle.push_back(monsters[pos]); monsters.erase(monsters.begin() + pos); continue; } if (monsters[pos]->attack >= life) { std::cout << "NIE" << std::endl; return 0; } life += monsters[pos]->bonus_att_diff; battle.push_back(monsters[pos]); monsters.erase(monsters.begin() + pos); } if (life <= 0) { std::cout << "NIE" << std::endl; return 0; } std::cout << "TAK" << std::endl; while (battle.size() > 0) { monster *tmp = battle.front(); battle.pop_front(); std::cout << tmp->position; if (battle.size() > 0) { std::cout << " "; } } } |
English