bzoj1069[SCOI2007]最大土地面积

先计算出凸包再在凸包上枚举对角线然后用旋转卡壳求最大四边形面积


var
  n,i,a1:longint;
  x,y:array[1..2000] of real;
  a:array[1..4000] of longint;
  ans:real;


function cj(k,i,j:longint):real;
begin
  cj:=(x[i]-x[k])*(y[j]-y[k])-(x[j]-x[k])*(y[i]-y[k]);
end;


function jl(i,j:longint):real;
begin
  jl:=sqrt(sqr(x[i]-x[j])+sqr(y[i]-y[j]));
end;


procedure tb;
var
  p,q,s:real;
  i,t,u,w:longint;
begin
  p:=maxlongint;
  q:=maxlongint;
  for i:=1 to n do
    if (x[i]<p)or(x[i]=p)and(y[i]<q) then
    begin
      p:=x[i];
      q:=y[i];
      u:=i;
    end;
  t:=0;
  a1:=1;
  a[1]:=u;
  while t<>u do
  begin
    if t=0 then t:=u;
    for i:=1 to n do
      if i<>t then
      begin
        w:=i;
        break;
      end;
    for i:=1 to n do
    begin
      s:=cj(t,w,i);
      if (s>0)or(s=0)and(jl(t,w)<jl(t,i)) then w:=i;
    end;
    inc(a1);
    a[a1]:=w;
    t:=w;
  end;
  dec(a1);
end;


procedure xzkk;
var
  i,j,b,c:longint;
  s:real;
begin
  for i:=1 to a1 do
  begin
    b:=i mod a1+1;
    c:=(i+1) mod a1+1;
    for j:=i+2 to a1 do
    begin
      while (abs(cj(a[i],a[j],a[b]))<abs(cj(a[i],a[j],a[b mod a1+1])))and(b mod a1+1<>j) do
        b:=b mod a1+1;
      while (abs(cj(a[i],a[j],a[c]))<abs(cj(a[i],a[j],a[c mod a1+1])))and(c mod a1+1<>i) do
        c:=c mod a1+1;
      s:=abs(cj(a[i],a[j],a[b]))/2+abs(cj(a[i],a[j],a[c]))/2;
      if s>ans then ans:=s;
    end;
  end;
end;


begin
  readln(n);
  for i:=1 to n do
    readln(x[i],y[i]);
  tb;
  xzkk;
  writeln(ans:0:3);
end.


你可能感兴趣的:(bzoj1069[SCOI2007]最大土地面积)