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~

 

posted @ 2014-08-12 22:20  Ixia  阅读(456)  评论(0编辑  收藏  举报