#include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstring> #include <iostream> #include <algorithm> #include <set> #define MAXN 100007 #define INF #define PB push_back #define MP make_pair #define ST first #define ND second #define REP(i,n) for(int i=0;i<(n);i++) #define FOR(a,b,c) for(int a=b;a<=(c);a++) #define FORD(a,b,c) for (int a=b;a>=(c);a--) #define VAR(v,n) __typeof(n) v=(n) #define ALL(c) c.begin(),c.end() #define FOREACH(i,c) for(VAR(i,(c).begin());i!=(c).end();i++) using namespace std; typedef long long LL; int n; int ile[2]; LL zycie,koszt,zysk; pair<LL,pair<LL,int> > t[2][MAXN]; bool mozna; int main(){ mozna = true; scanf("%d%lld",&n,&zycie); REP(i,n) { scanf("%lld%lld",&koszt,&zysk); if (koszt <= zysk) t[0][ile[0]++] = MP(koszt,MP(zysk,i)); else t[1][ile[1]++] = MP(zysk,MP(koszt,i)); } sort(t[0],t[0]+ile[0]); REP(i,ile[0]) { if (t[0][i].ST >= zycie) mozna = false; zycie += t[0][i].ND.ST - t[0][i].ST; } sort(t[1],t[1]+ile[1]); FORD(i,ile[1]-1,0) { if (t[1][i].ND.ST >= zycie) mozna = false; zycie += t[1][i].ST - t[1][i].ND.ST; } if (mozna) { puts("TAK"); REP(i,ile[0]) printf("%d ",t[0][i].ND.ND+1); FORD(i,ile[1]-1,0) printf("%d ",t[1][i].ND.ND+1); puts(""); } else puts("NIE"); 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 | #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstring> #include <iostream> #include <algorithm> #include <set> #define MAXN 100007 #define INF #define PB push_back #define MP make_pair #define ST first #define ND second #define REP(i,n) for(int i=0;i<(n);i++) #define FOR(a,b,c) for(int a=b;a<=(c);a++) #define FORD(a,b,c) for (int a=b;a>=(c);a--) #define VAR(v,n) __typeof(n) v=(n) #define ALL(c) c.begin(),c.end() #define FOREACH(i,c) for(VAR(i,(c).begin());i!=(c).end();i++) using namespace std; typedef long long LL; int n; int ile[2]; LL zycie,koszt,zysk; pair<LL,pair<LL,int> > t[2][MAXN]; bool mozna; int main(){ mozna = true; scanf("%d%lld",&n,&zycie); REP(i,n) { scanf("%lld%lld",&koszt,&zysk); if (koszt <= zysk) t[0][ile[0]++] = MP(koszt,MP(zysk,i)); else t[1][ile[1]++] = MP(zysk,MP(koszt,i)); } sort(t[0],t[0]+ile[0]); REP(i,ile[0]) { if (t[0][i].ST >= zycie) mozna = false; zycie += t[0][i].ND.ST - t[0][i].ST; } sort(t[1],t[1]+ile[1]); FORD(i,ile[1]-1,0) { if (t[1][i].ND.ST >= zycie) mozna = false; zycie += t[1][i].ST - t[1][i].ND.ST; } if (mozna) { puts("TAK"); REP(i,ile[0]) printf("%d ",t[0][i].ND.ND+1); FORD(i,ile[1]-1,0) printf("%d ",t[1][i].ND.ND+1); puts(""); } else puts("NIE"); return 0; } |