#include <cstdio> #include <vector> #include <algorithm> using namespace std; #define ULL unsigned long long ULL min(ULL a, ULL b) { return a < b ? a : b; } ULL max(ULL a, ULL b) { return a > b ? a : b; } vector<pair<ULL,ULL>> po; vector<pair<ULL,ULL>> ne; vector<int> order; vector<int> wm; struct comparator { bool operator()(const int &a, const int &b) { if (po[a].first != po[b].first) { return po[a].first > po[b].first; } return po[a].second > po[b].second; } }; bool not_same(const pair<ULL,ULL> &a, const pair<ULL,ULL> &b) { return !(a.first == b.first && a.second == b.second); } int main() { ULL INF = 1000000001; ULL t; scanf("%llu", &t); while (t--) { ULL n,x,y; scanf("%llu", &n); ULL *so = new ULL[n]; po.clear(); ne.clear(); order.clear(); wm.clear(); for (int i = 0; i < n; i++) { scanf("%llu%llu", &x, &y); po.push_back(make_pair(x,y)); ne.push_back(make_pair(x,y)); order.push_back(i); so[i] = 0; } sort(order.begin(), order.end(), comparator()); for (int idx = 0; idx < n; idx++) { int i = order[idx]; x = po[i].first; y = po[i].second; // printf("Szukam kumpla dla: %llu %llu z posrod: %d\n", x, y, ne.size()); ULL a = INF; ULL mateidx = INF; for (int j = 0; j < ne.size(); j++) { // printf("%llu %llu !!\n", ne[j].first, ne[j].second); if (not_same(po[i], ne[j]) && ne[j].first >= po[i].first && ne[j].second >= po[i].second) { // printf(" - rozwazam %llu %llu\n", ne[j].first, ne[j].second); ULL la = max(ne[j].second - po[i].second, ne[j].first - po[i].first); if (la < a) { a = la; mateidx = j; } } } if (mateidx != INF) { ULL a = max(ne[mateidx].second - po[i].second, ne[mateidx].first - po[i].first); // printf("- kumpel: %llu %llu o boku %llu\n", ne[mateidx].first, ne[mateidx].second, a); so[i] = a; // printf(" - dodaje do zbioru %llu %llu\n", x + a, y + a); ne.push_back(make_pair(x + a, y + a)); } else { // printf("- ni ma\n"); wm.push_back(i); } } ULL minx, miny; minx = miny = INF; ULL maxx, maxy; maxx = maxy = 0; for (int i = 0; i < n; i++) { minx = min(minx, po[i].first); miny = min(miny, po[i].second); maxx = max(maxx, po[i].first + so[i]); maxy = max(maxy, po[i].second + so[i]); } for (auto it = wm.begin(); it != wm.end(); it++) { ULL a = max(maxy - po[*it].second, maxx - po[*it].first); so[*it] = a; maxx = max(maxx, po[*it].first + so[*it]); maxy = max(maxy, po[*it].second + so[*it]); } ULL area = 0; for (int i = 0; i < n; i++) { area += so[i] * so[i]; } bool success = area == (maxx - minx) * (maxy - miny); if (success) { printf("TAK "); for (int i = 0; i < n; i++) printf("%llu ", so[i]); printf("\n"); } else { printf("NIE\n"); } delete [] so; } 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 119 120 121 122 123 124 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; #define ULL unsigned long long ULL min(ULL a, ULL b) { return a < b ? a : b; } ULL max(ULL a, ULL b) { return a > b ? a : b; } vector<pair<ULL,ULL>> po; vector<pair<ULL,ULL>> ne; vector<int> order; vector<int> wm; struct comparator { bool operator()(const int &a, const int &b) { if (po[a].first != po[b].first) { return po[a].first > po[b].first; } return po[a].second > po[b].second; } }; bool not_same(const pair<ULL,ULL> &a, const pair<ULL,ULL> &b) { return !(a.first == b.first && a.second == b.second); } int main() { ULL INF = 1000000001; ULL t; scanf("%llu", &t); while (t--) { ULL n,x,y; scanf("%llu", &n); ULL *so = new ULL[n]; po.clear(); ne.clear(); order.clear(); wm.clear(); for (int i = 0; i < n; i++) { scanf("%llu%llu", &x, &y); po.push_back(make_pair(x,y)); ne.push_back(make_pair(x,y)); order.push_back(i); so[i] = 0; } sort(order.begin(), order.end(), comparator()); for (int idx = 0; idx < n; idx++) { int i = order[idx]; x = po[i].first; y = po[i].second; // printf("Szukam kumpla dla: %llu %llu z posrod: %d\n", x, y, ne.size()); ULL a = INF; ULL mateidx = INF; for (int j = 0; j < ne.size(); j++) { // printf("%llu %llu !!\n", ne[j].first, ne[j].second); if (not_same(po[i], ne[j]) && ne[j].first >= po[i].first && ne[j].second >= po[i].second) { // printf(" - rozwazam %llu %llu\n", ne[j].first, ne[j].second); ULL la = max(ne[j].second - po[i].second, ne[j].first - po[i].first); if (la < a) { a = la; mateidx = j; } } } if (mateidx != INF) { ULL a = max(ne[mateidx].second - po[i].second, ne[mateidx].first - po[i].first); // printf("- kumpel: %llu %llu o boku %llu\n", ne[mateidx].first, ne[mateidx].second, a); so[i] = a; // printf(" - dodaje do zbioru %llu %llu\n", x + a, y + a); ne.push_back(make_pair(x + a, y + a)); } else { // printf("- ni ma\n"); wm.push_back(i); } } ULL minx, miny; minx = miny = INF; ULL maxx, maxy; maxx = maxy = 0; for (int i = 0; i < n; i++) { minx = min(minx, po[i].first); miny = min(miny, po[i].second); maxx = max(maxx, po[i].first + so[i]); maxy = max(maxy, po[i].second + so[i]); } for (auto it = wm.begin(); it != wm.end(); it++) { ULL a = max(maxy - po[*it].second, maxx - po[*it].first); so[*it] = a; maxx = max(maxx, po[*it].first + so[*it]); maxy = max(maxy, po[*it].second + so[*it]); } ULL area = 0; for (int i = 0; i < n; i++) { area += so[i] * so[i]; } bool success = area == (maxx - minx) * (maxy - miny); if (success) { printf("TAK "); for (int i = 0; i < n; i++) printf("%llu ", so[i]); printf("\n"); } else { printf("NIE\n"); } delete [] so; } return 0; } |