Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
AC贴代码:Source Code Problem: 1902 User: Los_Angelos_Laycurse Memory: 228K Time: 47MS Language: C++ Result: Accepted Source Code #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<stdio.h> #include<cmath> #include<map> using namespace std; double xx,yy; struct point { double x,y,l; int id; bool operator<(const point &temp)const { return l<temp.l; } }; point a[111],na[111]; int stack[111]; bool cmp(point a,point b) { return a.y<b.y; } int n,N; double pi=acos(-1.00),ans[111],eps=1e-7,in; bool cmft(point p,point q) { if(fabs((p.y-yy)*(q.x-xx)-(p.x-xx)*(q.y-yy))<eps) return fabs(p.x-xx)+fabs(p.y-yy)<fabs(q.x-xx)+fabs(q.y-yy); return (p.y-yy)*(q.x-xx)-(p.x-xx)*(q.y-yy)<0; } void solve(double x0,double y0,double theta1,double theta2,point a[],int n) { int nn=n/2,i; point b[111]; double alpha,x,y,nx,ny,theta,arg1,arg2; if(n==1) { ans[a[0].id]=theta1+pi/N; return; } if(nn*2.00*pi/N>=theta2-theta1) { for(i=nn;i<n;i++) ans[a[i].id]=0.00; solve(x0,y0,theta1,theta2,a,nn); } else { alpha=nn*2.00*pi/N; for(i=0;i<n;i++) { x=((y0-a[i].y)*cos(alpha+theta1)*cos(theta1)+a[i].x*sin(alpha+theta1)*cos(theta1)-x0*sin(theta1)*cos(alpha+theta1))/sin(alpha); y=(y0*sin(alpha+theta1)*cos(theta1)-a[i].y*sin(theta1)*cos(alpha+theta1)+(a[i].x-x0)*sin(alpha+theta1)*sin(theta1))/sin(alpha); double value=cos(theta1); if(fabs(value)>1e-5) a[i].l=(x-x0)/value; else a[i].l=(y-y0)/sin(theta1); } sort(a,a+n); x=(a[nn-1].x+a[nn].x)/2.00; y=(a[nn-1].y+a[nn].y)/2.00; nx=((y0-y)*cos(alpha+theta1)*cos(theta1)+x*sin(alpha+theta1)*cos(theta1)-x0*sin(theta1)*cos(alpha+theta1))/sin(alpha); ny=(y0*sin(alpha+theta1)*cos(theta1)-y*sin(theta1)*cos(alpha+theta1)+(x-x0)*sin(alpha+theta1)*sin(theta1))/sin(alpha); solve(nx,ny,theta1,theta1+alpha,a,nn); for(i=nn;i<n;i++) b[i-nn]=a[i]; alpha-=theta2-theta1; theta1=theta2; nx=((y0-y)*cos(alpha+theta1)*cos(theta1)+x*sin(alpha+theta1)*cos(theta1)-x0*sin(theta1)*cos(alpha+theta1))/sin(alpha); ny=(y0*sin(alpha+theta1)*cos(theta1)-y*sin(theta1)*cos(alpha+theta1)+(x-x0)*sin(alpha+theta1)*sin(theta1))/sin(alpha); solve(nx,ny,theta2+alpha,theta2,b,n-nn); } } void convexhull() { int i,j,s,p,q,id,top,id1,id2,ip,ip1,ip2,nn; double arg,sine,cosine,arg1,arg2; in=1000000000; for(i=0;i<n;i++) { if(in>a[i].y) { in=a[i].y; id=i; } } swap(a[0],a[id]); xx=a[0].x; yy=a[0].y; sort(a+1,a+n,cmft); stack[0]=0; stack[1]=1; top=2; for(i=2;i<n;i++) { while(top>=2&&(a[i].y-a[stack[top-2]].y)*(a[stack[top-1]].x-a[stack[top-2]].x)<(a[i].x-a[stack[top-2]].x)*(a[stack[top-1]].y-a[stack[top-2]].y)+eps) top--; stack[top++]=i; } in=1000000000; for(i=0;i<top;i++) { ip=stack[i]; ip1=stack[(i+top-1)%top]; ip2=stack[(i+1)%top]; double aa,bb,cc; aa=sqrt((a[ip1].x-a[ip].x)*(a[ip1].x-a[ip].x)+(a[ip1].y-a[ip].y)*(a[ip1].y-a[ip].y)); bb=sqrt((a[ip2].x-a[ip].x)*(a[ip2].x-a[ip].x)+(a[ip2].y-a[ip].y)*(a[ip2].y-a[ip].y)); cc=sqrt((a[ip1].x-a[ip2].x)*(a[ip1].x-a[ip2].x)+(a[ip1].y-a[ip2].y)*(a[ip1].y-a[ip2].y)); arg=(aa*aa+bb*bb-cc*cc)/(2*aa*bb); arg=acos(arg); if(in>arg) { in=arg; id=stack[i]; } } if(top<3) id=stack[0]; swap(a[id],a[0]); xx=a[0].x; yy=a[0].y; sort(a+1,a+n,cmft); xx=(a[n/2].x+a[n/2+1].x)/2.00; yy=(a[n/2].y+a[n/2+1].y)/2.00; nn=0; for(i=1;i<=n/2;i++) na[nn++]=a[i]; cosine=(xx-a[0].x)/sqrt((xx-a[0].x)*(xx-a[0].x)+(yy-a[0].y)*(yy-a[0].y)); if(cosine>1) cosine=1; if(cosine<-1) cosine=-1; arg=acos(cosine); if(yy-a[0].y<-eps) arg=-arg; arg1=arg-(pi-pi/N); arg2=arg; solve(a[0].x,a[0].y,arg1+pi,arg2+pi,na,nn); nn=0; for(i=n/2+1;i<n;i++) na[nn++]=a[i]; arg1=arg; arg2=arg+pi-pi/N; solve(a[0].x,a[0].y,arg1+pi,arg2+pi,na,nn); ans[a[0].id]=arg; } int main() { int i,j,s,p,q; scanf("%d",&n); N=n; for(i=0;i<n;i++) { scanf("%lf%lf",&a[i].x,&a[i].y); a[i].id=i; } if(n%2==0) { sort(a,a+n,cmp); solve(0,(a[n/2-1].y+a[n/2].y)/2.00,0,pi,a,n/2); for(i=n/2;i<n;i++) na[i-n/2]=a[i]; solve(0,(a[n/2-1].y+a[n/2].y)/2.00,pi,2*pi,na,n/2); } else convexhull(); for(i=0;i<N;i++) printf("%.15f\n",ans[i]); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator