uva 11529 Strange Tax Calculation (几何+计数)
题目链接: http://vjudge.net/problem/viewProblem.action?id=18277
这题暴力n^4妥妥的TLE!即使n^3也可能会T
正确的姿势应该是:枚举每个点作为三角形内(或外)的点,按对此点的极角排序,然后从某个点Aj开始,找到从它开始刚好转了超过180度的点,则j点Aj与此间转过的任何两个点组成的三角形都应该不包括中心点。
这样做可能是n^3的复杂度,但如果Aj做完后,Aj+1可以从上一次转过180度的点开始转,这样不就相当于n^2了
#include <stdio.h> #include <cstring> #include <cstdlib> #include <algorithm> #include <cmath> using namespace std; #define lson o<<1 #define rson o<<1|1 #define max(a,b) (a)>(b)?(a):(b) #define min(a,b) (a)<(b)?(a):(b) #define INF 200000000 #define pi acos(-1.0) #define eps 1e-9 typedef long long ll; double x[1500],y[1500]; double ang[1500*2]; int main(){ //freopen("s.in","r",stdin);freopen("s.out","w",stdout); int n,cs=1; while(scanf("%d",&n) && n){ int i; double ans=0,s,c; s=(double)(n-1)*(n-2)*(n-3)/6.0; c=(double)n*(n-1)*(n-2)/6.0; for(i=0;i<n;i++)scanf("%lf%lf",&x[i],&y[i]); if(n<4){ printf("City %d: 0.00\n",cs); continue; } for(i=0;i<n;i++){ int j,k; for(j=0,k=0;j<n;j++)if(i!=j){ ang[k]=atan2(y[j]-y[i],x[j]-x[i]); if(ang[k]<eps)ang[k]+=2*pi; k++; } sort(ang,ang+n-1); for(j=k;j<2*k;j++)ang[j]=ang[j-k]+2*pi; double temp=0;int pos=1; for(j=0;j<k;j++){ while(pos<=2*k&&ang[pos]-ang[j]<pi)pos++; if(pos-j>2)temp+=(pos-j-1)*(pos-j-2)/2.0; } ans+=(s-temp)/c; } printf("City %d: %.2lf\n",cs,ans); cs++; } return 0; }
772ms Accepted~