1. 程式人生 > >ACM-ICPC國際大學生程式設計競賽北京賽區(2017)網路賽 題解彙總 Territorial Dispute

ACM-ICPC國際大學生程式設計競賽北京賽區(2017)網路賽 題解彙總 Territorial Dispute

#include <iostream>
#include<algorithm>
#include<cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const double eps=1e-8;

int sgn(double x)
{
    if(fabs(x)<eps)return 0;
    if(x<0)return -1;
    return 1;
}

struct point
{
    double x,y;
};

struct
line { point s,e; }; double mul(point sp,point ep,point op) { return ((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y)); } bool inter(line u ,line v) { return ((max(u.s.x,u.e.x)>=min(v.s.x,v.e.x))&& (max(v.s.x,v.e.x)>=min(u.s.x,u.e.x))&& (max(u.s.y,u.e.y)>=min(v.s.y,v.e.y))&& (max(v.s.y,v.e.y)>=min(u.s.y,u.e.y))&& (mul(v.s,u.e,u.s)*mul(u.e,v.e,u.s)>=0
)&& (mul(u.s,v.e,v.s)*mul(v.e,u.e,v.s)>=0)); } double dist(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } double mian(double x1,double y1,double x2,double y2,double x3,double y3) { double d1,d2,d3,p; d1=dist(x1,y1,x2,y2); d2=dist(x2,y2,x3,y3); d3=dist(x1,y1,x3,y3); p=(d1+d2+d3)/2
; return sqrt(p*(p-d1)*(p-d2)*(p-d3)); } int main() { double x[110],y[110]; int t,n,i; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%lf%lf",&x[i],&y[i]); } if(n<3){printf("NO\n");continue;} if(n==3) { if((y[1]-y[0])*(x[2]-x[0])==(x[1]-x[0])*(y[2]-y[0])) { printf("YES\n"); double d0,d1,d2; d0=dist(x[1],y[1],x[2],y[2]); d1=dist(x[0],y[0],x[2],y[2]); d2=dist(x[1],y[1],x[0],y[0]); if(d0==d1+d2)printf("BAA\n"); else if(d1==d0+d2)printf("ABA\n"); else printf("AAB\n"); } else printf("NO\n"); continue; } if(n>=4) { printf("YES\n"); if((y[1]-y[0])*(x[2]-x[0])==(x[1]-x[0])*(y[2]-y[0])) { double d0,d1,d2; d0=dist(x[1],y[1],x[2],y[2]); d1=dist(x[0],y[0],x[2],y[2]); d2=dist(x[1],y[1],x[0],y[0]); if(d0==d1+d2)printf("BAA"); else if(d1==d0+d2)printf("ABA"); else printf("AAB"); for(i=0;i<n-3;i++)printf("A"); printf("\n"); } else { double s0,s1,s2,s3; s3=mian(x[0],y[0],x[1],y[1],x[2],y[2]); s2=mian(x[0],y[0],x[1],y[1],x[3],y[3]); s1=mian(x[0],y[0],x[3],y[3],x[2],y[2]); s0=mian(x[3],y[3],x[1],y[1],x[2],y[2]); if(sgn(s0+s1+s2-s3)==0)printf("AAAB"); else if(sgn(s0+s1-s2+s3)==0)printf("AABA"); else if(sgn(s0-s1+s2+s3)==0)printf("ABAA"); else if(sgn(s0-s1-s2-s3)==0)printf("ABBB"); else { point a,b,c,d; a.x=x[0]; a.y=y[0]; b.x=x[1]; b.y=y[1]; c.x=x[2]; c.y=y[2]; d.x=x[3]; d.y=y[3]; line ab,ac,ad,bc,bd,cd; ab.e=a; ab.s=b; ac.e=a; ac.s=c; ad.e=a; ad.s=d; bc.e=c; bc.s=b; bd.e=d; bd.s=b; cd.e=d; cd.s=c; if(inter(ab,cd))printf("AABB"); else if(inter(ac,bd))printf("ABAB"); else if(inter(ad,bc))printf("ABBA"); } for(i=0;i<n-4;i++)printf("A"); printf("\n"); } } } }