#include<cstdio> #include<algorithm> #include<vector> using namespace std; struct cal { int a,d; int in; }; bool cmpm(cal *a, cal *b) { return a->a > b->a; } bool cmpw(cal *a, cal *b) { return a->d < b->d; } int main() { vector<cal*> wskm; wskm.reserve(33000); vector<cal*> wskw; wskw.reserve(33000); vector<cal*> wskr; wskr.reserve(33000); cal ad[100000]; int maxrowne=0; int m=0,w=0,k=0,l=0; int n; long long int z; scanf("%d %d",&n,&z); for(int i=0;i<n;i++) { scanf("%d %d",&ad[i].d,&ad[i].a); ad[i].in=i; if(ad[i].a>ad[i].d) { wskw.push_back(&ad[i]); } else if(ad[i].a==ad[i].d) { if(ad[i].a>maxrowne) { maxrowne=ad[i].a; } wskw.push_back(&ad[i]); } else { wskm.push_back(&ad[i]); } } sort(wskw.begin(),wskw.end(),cmpw); for(vector<cal*>::iterator it=wskw.begin();it!=wskw.end();it++) { if(z<=(*it)->d) { printf("%s","NIE\n"); return 0; } z+=((*it)->a)-((*it)->d); } if(z<=maxrowne) { printf("%s","NIE\n"); return 0; } sort(wskm.begin(),wskm.end(),cmpm); for(vector<cal*>::iterator it=wskm.begin();it!=wskm.end();it++) { z-=(*it)->d; if(z<=0) { printf("%s","NIE\n"); return 0; } z+=(*it)->a; } printf("%s","TAK\n"); for(vector<cal*>::iterator it=wskw.begin();it!=wskw.end();it++) { printf("%d ",(*it)->in + 1); } for(vector<cal*>::iterator it=wskr.begin();it!=wskr.end();it++) { printf("%d ",(*it)->in + 1); } for(vector<cal*>::iterator it=wskm.begin();it!=wskm.end();it++) { printf("%d ",(*it)->in + 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 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 | #include<cstdio> #include<algorithm> #include<vector> using namespace std; struct cal { int a,d; int in; }; bool cmpm(cal *a, cal *b) { return a->a > b->a; } bool cmpw(cal *a, cal *b) { return a->d < b->d; } int main() { vector<cal*> wskm; wskm.reserve(33000); vector<cal*> wskw; wskw.reserve(33000); vector<cal*> wskr; wskr.reserve(33000); cal ad[100000]; int maxrowne=0; int m=0,w=0,k=0,l=0; int n; long long int z; scanf("%d %d",&n,&z); for(int i=0;i<n;i++) { scanf("%d %d",&ad[i].d,&ad[i].a); ad[i].in=i; if(ad[i].a>ad[i].d) { wskw.push_back(&ad[i]); } else if(ad[i].a==ad[i].d) { if(ad[i].a>maxrowne) { maxrowne=ad[i].a; } wskw.push_back(&ad[i]); } else { wskm.push_back(&ad[i]); } } sort(wskw.begin(),wskw.end(),cmpw); for(vector<cal*>::iterator it=wskw.begin();it!=wskw.end();it++) { if(z<=(*it)->d) { printf("%s","NIE\n"); return 0; } z+=((*it)->a)-((*it)->d); } if(z<=maxrowne) { printf("%s","NIE\n"); return 0; } sort(wskm.begin(),wskm.end(),cmpm); for(vector<cal*>::iterator it=wskm.begin();it!=wskm.end();it++) { z-=(*it)->d; if(z<=0) { printf("%s","NIE\n"); return 0; } z+=(*it)->a; } printf("%s","TAK\n"); for(vector<cal*>::iterator it=wskw.begin();it!=wskw.end();it++) { printf("%d ",(*it)->in + 1); } for(vector<cal*>::iterator it=wskr.begin();it!=wskr.end();it++) { printf("%d ",(*it)->in + 1); } for(vector<cal*>::iterator it=wskm.begin();it!=wskm.end();it++) { printf("%d ",(*it)->in + 1); } return 0; } |