zoukankan      html  css  js  c++  java
  • SWUST0249 (凸包面积)

      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.
  • 相关阅读:
    2019-1-17 水晶报表自动补空行及格线(无分组版)
    通过ssh证书远程登录
    kali linux下不能以root权限运行vlc的解决办法
    SSH服务:packet_write_wait: Connection to 67.218.143.160 port 22: Broken pipe错误处理
    python系列--函数--递归函数
    python虚拟环境安装pyqt5
    docker API接口service update错误记录 error while removing network:…
    docker service create api参数
    docker api参数文档
    docker 集群
  • 原文地址:https://www.cnblogs.com/rpSebastian/p/4573500.html
Copyright © 2011-2022 走看看