四边形的问题可以转化为三角形处理
穷举对角线,然后处理上下两个三角形,旋转卡壳

 1 var x,y:array[0..5010] of double;
 2     q:array[0..5010] of longint;
 3     l,r,i,j,k,t,n:longint;
 4     ans:double;
 5 
 6 function max(a,b:double):double;
 7   begin
 8     if a>b then exit(a) else exit(b);
 9   end;
10 
11 function cross(i,j,k,r:longint):double;
12   begin
13     exit((x[i]-x[j])*(y[k]-y[r])-(x[k]-x[r])*(y[i]-y[j]));
14   end;
15 
16 procedure swap(var a,b:double);
17   var c:double;
18   begin
19     c:=a;
20     a:=b;
21     b:=c;
22   end;
23 
24 procedure sort(l,r: longint);
25   var i,j: longint;
26       p,q:double;
27 
28   begin
29     i:=l;
30     j:=r;
31     p:=x[(l+r) shr 1];
32     q:=y[(l+r) shr 1];
33     repeat
34       while (x[i]<p) or (x[i]=p) and (y[i]<q) do inc(i);
35       while (p<x[j]) or (p=x[j]) and (q<y[j]) do dec(j);
36       if not(i>j) then
37       begin
38         swap(x[i],x[j]);
39         swap(y[i],y[j]);
40         inc(i);
41         j:=j-1;
42       end;
43     until i>j;
44     if l<j then sort(l,j);
45     if i<r then sort(i,r);
46   end;
47 
48 begin
49   readln(n);
50   for i:=1 to n do
51     readln(x[i],y[i]);
52   sort(1,n);
53   q[1]:=1;
54   t:=1;
55   for i:=2 to n do
56   begin
57     while (t>1) and (cross(q[t],q[t-1],i,q[t-1])<=0) do dec(t);
58     inc(t);
59     q[t]:=i;
60   end;
61   k:=t;
62   for i:=n-1 downto 1 do
63   begin
64     while (t>k) and (cross(q[t],q[t-1],i,q[t-1])<=0) do dec(t);
65     inc(t);
66     q[t]:=i;
67   end;
68   for i:=2 to t-1 do
69     q[i+t-1]:=q[i];
70   for i:=1 to t-1 do
71   begin
72     l:=i+1;
73     r:=i+3;
74     while (r<i+t-2) and (cross(q[i+2],q[i],q[r],q[i])<cross(q[i+2],q[i],q[r+1],q[i])) do inc(r);
75     ans:=max(ans,cross(q[i+1],q[i],q[i+2],q[i])+cross(q[i+2],q[i],q[r],q[i]));
76     for j:=i+3 to i+t-2 do
77     begin
78       while (l<j-1) and (cross(q[l+1],q[i],q[j],q[i])>cross(q[l],q[i],q[j],q[i])) do inc(l);
79       while (r<i+t-2) and (cross(q[j],q[i],q[r+1],q[i])>cross(q[j],q[i],q[r],q[i])) do inc(r);
80       ans:=max(ans,cross(q[l],q[i],q[j],q[i])+cross(q[j],q[i],q[r],q[i]));
81     end;
82   end;
83   ans:=ans/2;
84   writeln(ans:0:3);
85 end.
View Code

 

posted on 2015-03-07 20:53  acphile  阅读(125)  评论(0编辑  收藏  举报