#include<cstdio> #include<algorithm> #include<vector> using namespace std; typedef long long int lld; struct point{ lld x,y; int id; }; bool comp_x(const point& a, const point& b){ if(a.x == b.x) return a.y < b.y; return a.x < b.x; } bool comp_y(const point& a, const point& b){ if(a.y == b.y) return a.x < b.x; return a.y < b.y; } point t[2005]; lld d[2005]; int main(void){ int q; scanf("%d",&q); while(q--){ int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%lld%lld",&t[i].x,&t[i].y); if(n==1){ printf("TAK\n1\n"); return 0; } for(int i=0;i<n;i++){ d[i]=-1; t[i].id=i; } sort(t,t+n,comp_x); for(int i=0;i<n-1;i++) if(t[i].x == t[i+1].x) d[t[i].id]=t[i+1].y-t[i].y; sort(t,t+n,comp_y); for(int i=0;i<n-1;i++){ if(t[i].y == t[i+1].y) d[t[i].id]=t[i+1].x-t[i].x; } vector<point> v; for(int i=0;i<n;i++) if(d[i]==-1) v.push_back(t[i]); sort(v.begin(),v.end(),comp_x); for(int i=0;i<v.size()-1;i++) d[v[i].id]=v[i+1].x-v[i].x; lld maxx=0, maxy=0; for(int i=0;i<n;i++){ if(t[i].id == v.back().id) continue; maxx=max(maxx,d[t[i].id]+t[i].x); maxy=max(maxy,d[t[i].id]+t[i].y); } d[v.back().id]=max(maxx-v.back().x,maxy-v.back().y); lld pole=0; lld mnx=1e10,mxx=0; lld mny=1e10,mxy=0; for(int i=0;i<n;i++){ if(d[i]==0){ printf("NIE\n"); continue; } mnx=min(mnx,t[i].x); mny=min(mny,t[i].y); mxx=max(mxx,t[i].x+d[t[i].id]); mxy=max(mxy,t[i].y+d[t[i].id]); pole+=d[t[i].id]*d[t[i].id]; } if(pole != (mxx-mnx)*(mxy-mny)){ printf("NIE\n"); continue; } printf("TAK\n"); for(int i=0;i<n;i++) printf("%lld ",d[i]); printf("\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 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; typedef long long int lld; struct point{ lld x,y; int id; }; bool comp_x(const point& a, const point& b){ if(a.x == b.x) return a.y < b.y; return a.x < b.x; } bool comp_y(const point& a, const point& b){ if(a.y == b.y) return a.x < b.x; return a.y < b.y; } point t[2005]; lld d[2005]; int main(void){ int q; scanf("%d",&q); while(q--){ int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%lld%lld",&t[i].x,&t[i].y); if(n==1){ printf("TAK\n1\n"); return 0; } for(int i=0;i<n;i++){ d[i]=-1; t[i].id=i; } sort(t,t+n,comp_x); for(int i=0;i<n-1;i++) if(t[i].x == t[i+1].x) d[t[i].id]=t[i+1].y-t[i].y; sort(t,t+n,comp_y); for(int i=0;i<n-1;i++){ if(t[i].y == t[i+1].y) d[t[i].id]=t[i+1].x-t[i].x; } vector<point> v; for(int i=0;i<n;i++) if(d[i]==-1) v.push_back(t[i]); sort(v.begin(),v.end(),comp_x); for(int i=0;i<v.size()-1;i++) d[v[i].id]=v[i+1].x-v[i].x; lld maxx=0, maxy=0; for(int i=0;i<n;i++){ if(t[i].id == v.back().id) continue; maxx=max(maxx,d[t[i].id]+t[i].x); maxy=max(maxy,d[t[i].id]+t[i].y); } d[v.back().id]=max(maxx-v.back().x,maxy-v.back().y); lld pole=0; lld mnx=1e10,mxx=0; lld mny=1e10,mxy=0; for(int i=0;i<n;i++){ if(d[i]==0){ printf("NIE\n"); continue; } mnx=min(mnx,t[i].x); mny=min(mny,t[i].y); mxx=max(mxx,t[i].x+d[t[i].id]); mxy=max(mxy,t[i].y+d[t[i].id]); pole+=d[t[i].id]*d[t[i].id]; } if(pole != (mxx-mnx)*(mxy-mny)){ printf("NIE\n"); continue; } printf("TAK\n"); for(int i=0;i<n;i++) printf("%lld ",d[i]); printf("\n"); } return 0; } |