博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1007 凸壳
阅读量:5876 次
发布时间:2019-06-19

本文共 2249 字,大约阅读时间需要 7 分钟。

首先明确一个概念

左面内个叫上凸壳,右面那个叫下凸壳

然后我们只需要维护一个上图壳就行了,先按着斜率排序,每次加进来一条边,判断tot边和这个边与tot-1边的交点横坐标,

如果这条边的横坐标小就一直弹栈就好了

/**************************************************************    Problem: 1007    User: BLADEVIL    Language: Pascal    Result: Accepted    Time:360 ms    Memory:3352 kb****************************************************************/ //By BLADEVILvar    n                       :longint;    a, b, num               :array[0..100010] of longint;    quea, queb              :array[0..100010] of longint;    tot                     :longint;    quex                    :array[0..100010] of double;    ans                     :array[0..100010] of longint;    i                       :longint;     procedure swap(var a,b:longint);var    c                       :longint;begin    c:=a; a:=b; b:=c;end;     procedure qs(low,high:longint);var    i, j, xx, yy            :longint;begin    i:=low; j:=high; xx:=a[(i+j) div 2];    yy:=b[(i+j) div 2];    while i
yy) do inc(i);        while (a[j]>xx) or (a[j]=xx) and (b[j]
low then qs(low,j);end; procedure qs1(low,high:longint);var    i, j, xx                :longint;begin    i:=low; j:=high; xx:=ans[(i+j) div 2];    while i
xx do dec(j);        if i<=j then        begin            swap(ans[i],ans[j]);            inc(i); dec(j);        end;    end;    if i
low then qs1(low,j);end;     procedure insert(i:longint);var    k                       :longint;    x                       :double;begin    if a[i]=quea[tot] then exit;    if tot>1 then    begin        x:=(queb[tot-1]-b[i])/(a[i]-quea[tot-1]);        while (tot>1) and (x<=quex[tot]) do        begin            dec(tot);            x:=(queb[tot-1]-b[i])/(a[i]-quea[tot-1]);        end;    end;    inc(tot);    quea[tot]:=a[i];    queb[tot]:=b[i];    quex[tot]:=(queb[tot-1]-b[i])/(a[i]-quea[tot-1]);    ans[tot]:=num[i];end;     begin    read(n);    for i:=1 to n do read(a[i],b[i]);    for i:=1 to n do num[i]:=i;    qs(1,n);    quea[1]:=a[1]; queb[1]:=b[1];     quex[1]:=-maxlongint; ans[1]:=num[1];    tot:=1;    for i:=2 to n do insert(i);    qs1(1,tot);    for i:=1 to tot do write(ans[i],' ');end.

 

转载于:https://www.cnblogs.com/BLADEVIL/p/3470781.html

你可能感兴趣的文章
PHP之打开文件
查看>>
iOS - OC SQLite 数据库存储
查看>>
PHP-mysqllib和mysqlnd
查看>>
Redis常用命令
查看>>
NeHe OpenGL教程 第三十五课:播放AVI
查看>>
Linux下ping命令、traceroute命令、tracert命令的使用
查看>>
js replace,正则截取字符串内容
查看>>
socket
查看>>
Highcharts使用表格数据绘制图表
查看>>
Thinkphp5笔记三:创建基类
查看>>
LNMP之编译安装PHP出现的问题
查看>>
hdu5373
查看>>
4.单链表的创建和建立
查看>>
testng生成报告 testng-xslt 美化测试报告
查看>>
Android 好看的搜索界面,大赞Animation
查看>>
查询反模式 - GroupBy、HAVING的理解
查看>>
[转]动态加载javascript
查看>>
【协议】5、gossip 协议
查看>>
基于配置文件的redis的主从复制
查看>>
hasura graphql 角色访问控制
查看>>