#include <cstdio> #include <vector> #include <algorithm> using namespace std; #define MAX_N 100 #define INF 2000000000 int n, m; pair<int, int> V[MAX_N]; pair<pair<int, int>, int> V2[MAX_N]; int D[MAX_N]; int D2[MAX_N]; inline bool cmp(pair<pair<int, int>, int> p1, pair<pair<int, int> ,int> p2){ return make_pair(p1.first.second, p1.second) < make_pair(p2.first.second, p2.second); } vector<int> buf; int asd = 0; int main(){ scanf("%d%d", &n, &m); int maxK = 0; for(int a=0; a<n; ++a){ scanf("%d%d%d", &V[a].first, &V[a].second, &D2[a]); D[a] = D2[a]; maxK = max(maxK, V[a].second); V2[a].first = V[a]; V2[a].second = a; } sort(V2, V2 + n, cmp); label: int last = 0; while(maxK > last){ int step = maxK - last; for(int b=0; b<n; ++b){ if(D[b] != 0){ step = min(step, D[b]); if(V[b].first > last)step = min(step, V[b].first - last); else if(D[b] < V[b].second - last)step = min(step, V[b].second - last - D[b]); } } buf.clear(); for(int b=0; b<n; ++b){ if(V[b].first <= last && D[b] != 0){ if(D[b] == V[b].second - last){ buf.push_back(b); } } } if(int(buf.size()) > m){ if(asd == 1){ printf("NIE"); return 0; } ++asd; maxK = 0; for(int a=0; a<n; ++a){ V[a] = {1000000 - V[a].second, 1000000 - V[a].first}; D[a] = D2[a]; maxK = max(maxK, V[a].second); V2[a].first = V[a]; V2[a].second = a; } sort(V2, V2 + n, cmp); goto label; } if(int(buf.size()) != m){ for(int b=0; b<n; ++b){ if(V2[b].first.first <= last && D[V2[b].second] != 0){ if(D[V2[b].second] != V2[b].first.second - last){ buf.push_back(V2[b].second); if(int(buf.size()) >= m)break; } } } } for(int x : buf){ D[x] -= step; } last += step; } printf("TAK"); 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 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; #define MAX_N 100 #define INF 2000000000 int n, m; pair<int, int> V[MAX_N]; pair<pair<int, int>, int> V2[MAX_N]; int D[MAX_N]; int D2[MAX_N]; inline bool cmp(pair<pair<int, int>, int> p1, pair<pair<int, int> ,int> p2){ return make_pair(p1.first.second, p1.second) < make_pair(p2.first.second, p2.second); } vector<int> buf; int asd = 0; int main(){ scanf("%d%d", &n, &m); int maxK = 0; for(int a=0; a<n; ++a){ scanf("%d%d%d", &V[a].first, &V[a].second, &D2[a]); D[a] = D2[a]; maxK = max(maxK, V[a].second); V2[a].first = V[a]; V2[a].second = a; } sort(V2, V2 + n, cmp); label: int last = 0; while(maxK > last){ int step = maxK - last; for(int b=0; b<n; ++b){ if(D[b] != 0){ step = min(step, D[b]); if(V[b].first > last)step = min(step, V[b].first - last); else if(D[b] < V[b].second - last)step = min(step, V[b].second - last - D[b]); } } buf.clear(); for(int b=0; b<n; ++b){ if(V[b].first <= last && D[b] != 0){ if(D[b] == V[b].second - last){ buf.push_back(b); } } } if(int(buf.size()) > m){ if(asd == 1){ printf("NIE"); return 0; } ++asd; maxK = 0; for(int a=0; a<n; ++a){ V[a] = {1000000 - V[a].second, 1000000 - V[a].first}; D[a] = D2[a]; maxK = max(maxK, V[a].second); V2[a].first = V[a]; V2[a].second = a; } sort(V2, V2 + n, cmp); goto label; } if(int(buf.size()) != m){ for(int b=0; b<n; ++b){ if(V2[b].first.first <= last && D[V2[b].second] != 0){ if(D[V2[b].second] != V2[b].first.second - last){ buf.push_back(V2[b].second); if(int(buf.size()) >= m)break; } } } } for(int x : buf){ D[x] -= step; } last += step; } printf("TAK"); return 0; } |