#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
#define REP(x,n) for(int x=0;x<(n);++x)
#define VAR(x,n) __typeof(n) x = (n)
#define FOREACH(x,n) for(VAR(x,(n).begin());x!=(n).end();++x)
int n, d,a;
long long z;
struct PII {
int first;
int second;
int third;
PII(int f, int s, int t): first(f), second(s), third(t) {}
PII() {}
};
struct comp1 {
bool operator() (const PII& e, const PII& f) {
return e.first==f.first ? e.third < f.third : e.first < f.first;
}
};
struct comp2 {
bool operator() (const PII& e, const PII& f) {
return e.first+e.second == f.first+f.second ? e.third<f.third : e.first+e.second > f.first+f.second;
}
};
set<PII, comp1> plusy;
set<PII, comp2> minusy;
int main() {
ios_base::sync_with_stdio(false);
cin>>n>>z;
vector<int> odp;
odp.reserve(n);
set<PII>::iterator it;
long long suma_minusy=0; ///minusy od wrogów
REP(x,n) {
cin>>d>>a;
if (d>a) {/// więcej straci niż zyska po walce
minusy.insert(PII(d,a-d,x));
suma_minusy += d-a;
} else if (d>=z) /// zginie
plusy.insert(PII(d,a-d,x));
else {
odp.push_back(x);
z += a-d;
while(plusy.size() && (it=plusy.begin())->first < z) {
odp.push_back(it->third);
z += it->second;
plusy.erase(it);
}
}
}
if (plusy.size() || z<=suma_minusy) {
cout << "NIE" << endl;
return 0;
}
FOREACH(it, minusy) {
if (z<=it->first) {
cout << "NIE" << endl;
return 0;
}
z += it->second;
odp.push_back(it->third);
}
cout << "TAK " << endl;
FOREACH(it, odp)
cout << *it+1 << " ";
// FOREACH(it, minusy)
// cout << "("<<it->first<<","<<it->second<<","<<it->third+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 | #include <iostream> #include <algorithm> #include <set> using namespace std; #define REP(x,n) for(int x=0;x<(n);++x) #define VAR(x,n) __typeof(n) x = (n) #define FOREACH(x,n) for(VAR(x,(n).begin());x!=(n).end();++x) int n, d,a; long long z; struct PII { int first; int second; int third; PII(int f, int s, int t): first(f), second(s), third(t) {} PII() {} }; struct comp1 { bool operator() (const PII& e, const PII& f) { return e.first==f.first ? e.third < f.third : e.first < f.first; } }; struct comp2 { bool operator() (const PII& e, const PII& f) { return e.first+e.second == f.first+f.second ? e.third<f.third : e.first+e.second > f.first+f.second; } }; set<PII, comp1> plusy; set<PII, comp2> minusy; int main() { ios_base::sync_with_stdio(false); cin>>n>>z; vector<int> odp; odp.reserve(n); set<PII>::iterator it; long long suma_minusy=0; ///minusy od wrogów REP(x,n) { cin>>d>>a; if (d>a) {/// więcej straci niż zyska po walce minusy.insert(PII(d,a-d,x)); suma_minusy += d-a; } else if (d>=z) /// zginie plusy.insert(PII(d,a-d,x)); else { odp.push_back(x); z += a-d; while(plusy.size() && (it=plusy.begin())->first < z) { odp.push_back(it->third); z += it->second; plusy.erase(it); } } } if (plusy.size() || z<=suma_minusy) { cout << "NIE" << endl; return 0; } FOREACH(it, minusy) { if (z<=it->first) { cout << "NIE" << endl; return 0; } z += it->second; odp.push_back(it->third); } cout << "TAK " << endl; FOREACH(it, odp) cout << *it+1 << " "; // FOREACH(it, minusy) // cout << "("<<it->first<<","<<it->second<<","<<it->third+1<<") "; return 0; } |
English