zoukankan      html  css  js  c++  java
  • bzoj1913

    这是一道好题,要求每个三点圆覆盖的点数和

    我们可以算四边形的贡献,四边形显然分成两种:凸四边形和凹四边形

    显然,凹四边形的覆盖只可能是三个点组成三角形包含另一个点,所以贡献是1

    凸四边形,其最小圆覆盖是以最长对角线为直径的

    注意一个很重要的条件,四点不共圆,所以凸四边形的贡献是2

    四边形总数是一定的,显然统计凹四边形更方便

    穷举一个点作为原点,即求包含原点的三角形数目——转化为bzoj1914,解决了!

      1 uses math;
      2 type node=record
      3        x,y:longint;
      4      end;
      5 
      6 var c,b:array[0..1510] of node;
      7     tot,n,a,d:int64;
      8     i:longint;
      9 
     10 procedure swap(var a,b:node);
     11   var c:node;
     12   begin
     13     c:=a;
     14     a:=b;
     15     b:=c;
     16   end;
     17 
     18 function cross(a,b:node):double;
     19   begin
     20     exit(int64(a.x)*int64(b.y)-int64(a.y)*int64(b.x));
     21   end;
     22 
     23 function cmp(a,b:node):boolean;
     24   begin
     25     if (a.y>0) and (b.y<=0) then exit(true);
     26     if (b.y>0) and (a.y<=0) then exit(false);
     27     if cross(a,b)>0 then exit(true);
     28     exit(false);
     29   end;
     30 
     31 procedure sort(l,r:longint);
     32   var i,j:longint;
     33       x:node;
     34   begin
     35     i:=l;
     36     j:=r;
     37     x:=c[(l+r) shr 1];
     38     repeat
     39       while cmp(c[i],x) do inc(i);
     40       while cmp(x,c[j]) do dec(j);
     41       if not(i>j) then
     42       begin
     43         swap(c[i],c[j]);
     44         inc(i);
     45         dec(j);
     46       end;
     47     until i>j;
     48     if l<j then sort(l,j);
     49     if i<r then sort(i,r);
     50   end;
     51 
     52 function dis(a:node):double;
     53   begin
     54     exit(sqrt(sqr(a.x)+sqr(a.y)));
     55   end;
     56 
     57 function get(k:longint):int64;
     58   var i,s,t,r:longint;
     59       p:node;
     60   begin
     61     p:=b[k];
     62     t:=0;
     63     for i:=1 to n do
     64       if i<>k then
     65       begin
     66         inc(t);
     67         c[t].x:=b[i].x-p.x;
     68         c[t].y:=b[i].y-p.y;
     69       end;
     70     sort(1,t);
     71     get:=(n-1)*(n-2)*(n-3) div 6;
     72     r:=2;
     73     s:=0;
     74     for i:=1 to t do
     75     begin
     76       while cross(c[i],c[r])>=0 do
     77       begin
     78         r:=r mod t+1;
     79         inc(s);
     80         if r=i then break;
     81       end;
     82       get:=get-(s-1)*s div 2;
     83       dec(s);
     84     end;
     85   end;
     86 
     87 begin
     88   readln(n);
     89   if n=3 then
     90   begin
     91     writeln(3.00);
     92     halt;
     93   end;
     94   for i:=1 to n do
     95     readln(b[i].x,b[i].y);
     96   for i:=1 to n do
     97     a:=a+get(i);
     98 
     99   d:=n*(n-1)*(n-2)*(n-3) div 24-a;
    100   tot:=(n-1)*(n-2)*n div 6;
    101   writeln((a+2*d)/tot+3:0:6);
    102 end.
    View Code
  • 相关阅读:
    关于共享安全的几个命令
    从句语法
    WampServer 在 httpd.conf 中配置多站点 (IP 配置法:不用每次修改 hosts 文件 + 域名配置法 )
    Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
    Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
    Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
    Java实现 蓝桥杯 算法训练 1的个数
    Java实现 蓝桥杯 算法训练 1的个数
    Java实现 蓝桥杯 算法训练 1的个数
    谷歌面试题之扔鸡蛋的问题(蓝桥杯摔手机的问题)
  • 原文地址:https://www.cnblogs.com/phile/p/4553370.html
Copyright © 2011-2022 走看看