#include <cstdio> #include <algorithm> using namespace std; #define FOR(v,p,k) for(int v=p;v<=k;++v) #define FORD(v,p,k) for(int v=p;v>=k;--v) #define REP(i,n) for(int i=0;i<(n);++i) #define ALL(c) (c).begin(),(c).end() #define ZERO(x) memset(x,0,sizeof(x)) typedef long long LL; typedef unsigned long long ULL; const int INF = 1000000000; const int MAX = 100000; int D[MAX], A[MAX]; int G[MAX], B[MAX]; int R[MAX]; bool compG(int x, int y) { return D[x] < D[y] || (D[x] == D[y] && A[x] > A[y]) || (D[x] == D[y] && A[x] == A[y] && x < y); } bool compB(int x, int y) { return A[x] < A[y] || (A[x] == A[y] && D[x] > D[y]) || (A[x] == A[y] && D[x] == D[y] && x < y); } int main(int argc, char **args) { int n, d, a; LL z; scanf("%d %lld", &n, &z); int gCnt = 0, bCnt = 0, rCnt = 0; LL ze = z; REP(i, n) { scanf("%d %d", &d, &a); D[i] = d; A[i] = a; ze += a - d; if (a >= d) G[gCnt++] = i; else B[bCnt++] = i; } sort(G, G + gCnt, compG); sort(B, B + bCnt, compB); bool found = true; REP(i, gCnt) { if (z <= D[G[i]]) { found = false; break; } z += A[G[i]] - D[G[i]]; R[rCnt++] = G[i] + 1; } if (found) { rCnt = n - 1; REP(i, bCnt) { if (ze <= A[B[i]]) { found = false; break; } ze += D[B[i]] - A[B[i]]; R[rCnt--] = B[i] + 1; } } if (found) { printf("TAK\n"); REP(i, n - 1) printf("%d ", R[i]); printf("%d\n", R[n - 1]); } 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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <cstdio> #include <algorithm> using namespace std; #define FOR(v,p,k) for(int v=p;v<=k;++v) #define FORD(v,p,k) for(int v=p;v>=k;--v) #define REP(i,n) for(int i=0;i<(n);++i) #define ALL(c) (c).begin(),(c).end() #define ZERO(x) memset(x,0,sizeof(x)) typedef long long LL; typedef unsigned long long ULL; const int INF = 1000000000; const int MAX = 100000; int D[MAX], A[MAX]; int G[MAX], B[MAX]; int R[MAX]; bool compG(int x, int y) { return D[x] < D[y] || (D[x] == D[y] && A[x] > A[y]) || (D[x] == D[y] && A[x] == A[y] && x < y); } bool compB(int x, int y) { return A[x] < A[y] || (A[x] == A[y] && D[x] > D[y]) || (A[x] == A[y] && D[x] == D[y] && x < y); } int main(int argc, char **args) { int n, d, a; LL z; scanf("%d %lld", &n, &z); int gCnt = 0, bCnt = 0, rCnt = 0; LL ze = z; REP(i, n) { scanf("%d %d", &d, &a); D[i] = d; A[i] = a; ze += a - d; if (a >= d) G[gCnt++] = i; else B[bCnt++] = i; } sort(G, G + gCnt, compG); sort(B, B + bCnt, compB); bool found = true; REP(i, gCnt) { if (z <= D[G[i]]) { found = false; break; } z += A[G[i]] - D[G[i]]; R[rCnt++] = G[i] + 1; } if (found) { rCnt = n - 1; REP(i, bCnt) { if (ze <= A[B[i]]) { found = false; break; } ze += D[B[i]] - A[B[i]]; R[rCnt--] = B[i] + 1; } } if (found) { printf("TAK\n"); REP(i, n - 1) printf("%d ", R[i]); printf("%d\n", R[n - 1]); } else printf("NIE\n"); return 0; } |