1 type node=record x,y:longint; end; 2 const maxn=3008; 3 var k,q,qq:longint; 4 sum:double; 5 f,g:array[0..maxn] of node; 6 m,i,j,a,b:longint; 7 stack:array[0..maxn] of longint; 8 nm:longint; 9 function dis(a,b:node):double; 10 begin 11 exit(sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))); 12 end; 13 procedure swap(var a,b:node); inline; 14 var c:node; 15 begin 16 c:=a; a:=b; b:=c; 17 end; 18 function dig(a,b:node):longint; inline; 19 begin 20 exit(a.x*b.y-a.y*b.x); 21 end; 22 function mk(a,b:node):node; inline; 23 begin 24 mk.x:=b.x-a.x; 25 mk.y:=b.y-a.y; 26 end; 27 function cmp(a,b:node):boolean; inline; 28 var p1,p2:node; 29 begin 30 p1:=mk(f[1],a); 31 p2:=mk(f[1],b); 32 if dig(P1,P2)<0 then exit(true); 33 if dig(P1,P2)=0 then 34 if dis(f[1],a)>dis(f[1],b) then 35 exit(true); 36 exit(false); 37 end; 38 procedure sort(l,r:longint); 39 var i,j:longint; 40 x:node; 41 begin 42 i:=l; j:=r; x:=f[(l+r) div 2]; 43 while i<=j do 44 begin 45 while cmp(f[i],x) do inc(i); 46 while cmp(x,f[j]) do dec(j); 47 if i<=j then 48 begin 49 swap(f[i],f[j]); 50 inc(i); dec(j); 51 end; 52 end; 53 if l<j then sort(l,j); 54 if i<r then sort(i,r); 55 end; 56 begin 57 readln(q); 58 for qq:=1 to q do 59 begin 60 readln(m); 61 for i:=1 to m do readln(f[i].x,f[i].y); 62 if m=2 then begin writeln('0.0'); continue; end; 63 j:=1; 64 for i:=2 to m do 65 if (f[i].y<f[j].y) or (f[i].y=f[j].y) and (f[i].x<f[j].x) then 66 j:=i; 67 swap(f[1],f[j]); 68 sort(2,m); 69 k:=2; 70 g[1]:=f[1]; g[2]:=f[2]; 71 for i:=3 to m do 72 if dig(mk(f[1],f[i]),mk(f[1],f[i-1]))<>0 then 73 begin 74 inc(k); 75 g[k]:=f[i]; 76 end; 77 nm:=3; 78 stack[1]:=1; stack[2]:=2; stack[3]:=3; 79 for i:=4 to k do 80 begin 81 a:=stack[nm-1]; 82 b:=stack[nm]; 83 while dig(mk(g[a],g[b]),mk(g[a],g[i]))>0 do 84 begin 85 dec(nm); 86 a:=stack[nm-1]; 87 b:=stack[nm]; 88 end; 89 inc(nm); 90 stack[nm]:=i; 91 end; 92 sum:=0; 93 while nm>=3 do 94 begin 95 a:=stack[nm]; 96 b:=stack[nm-1]; 97 sum:=sum+abs(dig(mk(g[1],g[b]),mk(g[1],g[a])))/2; 98 dec(nm); 99 end; 100 writeln(sum:0:1); 101 end; 102 end.