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~

 

你可能感兴趣的:(uva)