zoukankan      html  css  js  c++  java
  • 1069: [SCOI2007]最大土地面积

    Description

    在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大。
    Input

    第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标。
    Output

    最大的多边形面积,答案精确到小数点后3位。
    Sample Input
    5
    0 0
    1 0
    1 1
    0 1
    0.5 0.5
    Sample Output
    1.000

    HINT

    数据范围 n<=2000, |x|,|y|<=100000

    先求凸包

    然后枚举四边形的对角线,分别找到距离最远的两个点更新答案(这两个点都是单调的),总复杂度是O(n^2)的

    哪里写挫了,超慢,总时间1600ms

      1 const
      2         maxn=2010;
      3 type
      4         point=record
      5           x,y:double;
      6         end;
      7 var
      8         a:array[0..maxn]of point;
      9         n:longint;
     10         min:point;
     11  
     12 function cj(a,b,c:point):double;
     13 begin
     14         exit((a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y));
     15 end;
     16  
     17 procedure swap(var x,y:point);
     18 var
     19         t:point;
     20 begin
     21         t:=x;x:=y;y:=t;
     22 end;
     23  
     24 procedure sort(l,r:longint);
     25 var
     26         i,j:longint;
     27         y:point;
     28 begin
     29         i:=l;
     30         j:=r;
     31         y:=a[(l+r)>>1];
     32         repeat
     33           while cj(y,a[i],min)<0 do
     34             inc(i);
     35           while cj(y,a[j],min)>0 do
     36             dec(j);
     37           if i<=j then
     38           begin
     39             swap(a[i],a[j]);
     40             inc(i);
     41             dec(j);
     42           end;
     43         until i>j;
     44         if i<r then sort(i,r);
     45         if j>l then sort(l,j);
     46 end;
     47  
     48 procedure init;
     49 var
     50         i:longint;
     51 begin
     52         read(n);
     53         min.x:=maxlongint;
     54         min.y:=maxlongint;
     55         for i:=1 to n do
     56           begin
     57             read(a[i].x,a[i].y);
     58             if (a[i].x<min.x) or ((a[i].x=min.x) and (a[i].y<min.y)) then min:=a[i];
     59           end;
     60         i:=n;
     61         while i>0 do
     62           begin
     63             if (a[i].x=min.x) and (a[i].y=min.y) then
     64               begin
     65                 a[i]:=a[n];
     66                 dec(n);
     67               end
     68             else dec(i);
     69           end;
     70         sort(1,n);
     71         inc(n);
     72         a[n]:=min;
     73         a[0]:=min;
     74 end;
     75  
     76 var
     77         q:array[0..maxn]of longint;
     78         f:array[0..maxn,0..1]of double;
     79         tot,lasta,lastb:longint;
     80         ans:double;
     81  
     82 function up(var x:double;y:double):boolean;
     83 begin
     84         if x<y then
     85         begin
     86           x:=y;
     87           exit(true);
     88         end;
     89         exit(false);
     90 end;
     91  
     92 function down(var x:double;y:double):boolean;
     93 begin
     94         if x>y then
     95         begin
     96           x:=y;
     97           exit(true);
     98         end;
     99         exit(false);
    100 end;
    101  
    102 procedure work;
    103 var
    104         i,j:longint;
    105 begin
    106         for i:=1 to n do
    107           begin
    108             while (tot>0) and (cj(a[i],a[q[tot]],a[q[tot-1]])>=0) do
    109               dec(tot);
    110             inc(tot);
    111             q[tot]:=i;
    112           end;
    113         for i:=1 to tot-1 do
    114           begin
    115             f[i+1,1]:=-maxlongint;
    116             f[i+1,0]:=0;
    117             for j:=1 to n do
    118               if up(f[i+1,1],cj(a[q[i+1]],a[q[j]],a[q[i]])) then lasta:=j;
    119             lastb:=i;
    120             for j:=i+2 to tot do
    121               begin
    122                 f[j,1]:=cj(a[q[j]],a[q[lasta]],a[q[i]]);
    123                 f[j,0]:=cj(a[q[j]],a[q[lastb]],a[q[i]]);
    124                 while up(f[j,1],cj(a[q[j]],a[q[lasta mod tot+1]],a[q[i]])) do
    125                   lasta:=lasta mod tot+1;
    126                 while down(f[j,0],cj(a[q[j]],a[q[lastb mod tot+1]],a[q[i]])) do
    127                   lastb:=lastb mod tot+1;
    128                 up(ans,f[j,1]-f[j,0]);
    129               end;
    130           end;
    131         writeln(ans/2:0:3);
    132 end;
    133  
    134 begin
    135         init;
    136         work;
    137 end.
    View Code
  • 相关阅读:
    小小小康
    GC日志补充
    一次GC问题定位
    mycat1.5~1.6的一个bug
    [转] java Statement和PreparedStatement批量更新
    java 中的instanceof 运算符
    Java学习篇之数组方法
    iOS7适配的一点小技巧
    iOS 中正确切换摄像头&正确实现设置帧率的方式
    iOS 音量键事件监控响应
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3682463.html
Copyright © 2011-2022 走看看