#include <cstdio>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
struct monster {
int dmg;
int heal;
int index;
monster(){}
monster(int dmg, int heal) : dmg(dmg), heal(heal) {}
};
struct nettoMonster {
int dif;
monster other;
nettoMonster(){}
nettoMonster(int dif, monster other) : dif(dif), other(other) {}
};
inline bool operator<( const monster& lhs, const monster& rhs ) {
return lhs.dmg == rhs.dmg ? lhs.heal == rhs.heal ? lhs.index < rhs.index : lhs.heal < rhs.heal : lhs.dmg < rhs.dmg;
}
inline bool operator<( const nettoMonster& lhs, const nettoMonster& rhs ) {
return lhs.dif == rhs.dif ? rhs.other < lhs.other : lhs.dif < rhs.dif;
}
int main() {
int n, hp;
scanf("%d%d",&n,&hp);
vector<monster> healers;
multiset<monster> monsters;
multiset<nettoMonster> netto;
for(int i = 0; i < n; i++) {
monster m;
scanf("%d%d",&m.dmg, &m.heal);
m.index = i + 1;
if(m.heal >= m.dmg)
healers.push_back(m);
else {
monsters.insert(m);
netto.insert(nettoMonster(m.dmg - m.heal, m));
}
}
sort(healers.begin(), healers.end());
vector<int> result;
bool fail = false;
for(int i = 0; i < healers.size(); i++) {
if(hp > healers[i].dmg) {
hp -= healers[i].dmg;
hp += healers[i].heal;
result.push_back(healers[i].index);
} else {
fail = true;
break;
}
}
if(fail) {
printf("NIE\n");
return 0;
}
while(!monsters.empty()) {
if(monsters.size() == 1) {
if(monsters.begin()->dmg < hp) {
result.push_back(monsters.begin()->index);
monsters.clear();
break;
} else {
printf("NIE\n");
return 0;
}
}
set<monster>::reverse_iterator wtf = monsters.rbegin();
wtf++;
if(hp - monsters.rbegin()->dmg + monsters.rbegin()->heal > wtf->dmg) {
result.push_back(monsters.rbegin()->index);
hp -= monsters.rbegin()->dmg;
hp += monsters.rbegin()->heal;
netto.erase(nettoMonster(monsters.rbegin()->dmg - monsters.rbegin()->heal, *monsters.rbegin()));
monsters.erase(*monsters.rbegin());
} else {
if(hp - netto.begin()->dif > monsters.rbegin()->dmg) {
hp -= netto.begin()->dif;
result.push_back(netto.begin()->other.index);
monsters.erase(netto.begin()->other);
netto.erase(*netto.begin());
} else {
printf("NIE\n");
return 0;
}
}
}
printf("TAK\n");
for(int i = 0; i < result.size(); i++) {
printf("%d ", result[i]);
}
printf("\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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #include <cstdio> #include <vector> #include <algorithm> #include <set> using namespace std; struct monster { int dmg; int heal; int index; monster(){} monster(int dmg, int heal) : dmg(dmg), heal(heal) {} }; struct nettoMonster { int dif; monster other; nettoMonster(){} nettoMonster(int dif, monster other) : dif(dif), other(other) {} }; inline bool operator<( const monster& lhs, const monster& rhs ) { return lhs.dmg == rhs.dmg ? lhs.heal == rhs.heal ? lhs.index < rhs.index : lhs.heal < rhs.heal : lhs.dmg < rhs.dmg; } inline bool operator<( const nettoMonster& lhs, const nettoMonster& rhs ) { return lhs.dif == rhs.dif ? rhs.other < lhs.other : lhs.dif < rhs.dif; } int main() { int n, hp; scanf("%d%d",&n,&hp); vector<monster> healers; multiset<monster> monsters; multiset<nettoMonster> netto; for(int i = 0; i < n; i++) { monster m; scanf("%d%d",&m.dmg, &m.heal); m.index = i + 1; if(m.heal >= m.dmg) healers.push_back(m); else { monsters.insert(m); netto.insert(nettoMonster(m.dmg - m.heal, m)); } } sort(healers.begin(), healers.end()); vector<int> result; bool fail = false; for(int i = 0; i < healers.size(); i++) { if(hp > healers[i].dmg) { hp -= healers[i].dmg; hp += healers[i].heal; result.push_back(healers[i].index); } else { fail = true; break; } } if(fail) { printf("NIE\n"); return 0; } while(!monsters.empty()) { if(monsters.size() == 1) { if(monsters.begin()->dmg < hp) { result.push_back(monsters.begin()->index); monsters.clear(); break; } else { printf("NIE\n"); return 0; } } set<monster>::reverse_iterator wtf = monsters.rbegin(); wtf++; if(hp - monsters.rbegin()->dmg + monsters.rbegin()->heal > wtf->dmg) { result.push_back(monsters.rbegin()->index); hp -= monsters.rbegin()->dmg; hp += monsters.rbegin()->heal; netto.erase(nettoMonster(monsters.rbegin()->dmg - monsters.rbegin()->heal, *monsters.rbegin())); monsters.erase(*monsters.rbegin()); } else { if(hp - netto.begin()->dif > monsters.rbegin()->dmg) { hp -= netto.begin()->dif; result.push_back(netto.begin()->other.index); monsters.erase(netto.begin()->other); netto.erase(*netto.begin()); } else { printf("NIE\n"); return 0; } } } printf("TAK\n"); for(int i = 0; i < result.size(); i++) { printf("%d ", result[i]); } printf("\n"); return 0; } |
English