首先明确一个概念

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

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

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

/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
//By BLADEVIL
var
    n                       :longint;
    a, b, num               :array[..] of longint;
    quea, queb              :array[..] of longint;
    tot                     :longint;
    quex                    :array[..] of double;
    ans                     :array[..] 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 ];
    yy:=b[(i+j) div ];
    while i<j do
    begin
        while (a[i]<xx) or (a[i]=xx) and (b[i]>yy) do inc(i);
        while (a[j]>xx) or (a[j]=xx) and (b[j]<yy) do dec(j);
        if i<=j then
        begin
            swap(a[i],a[j]);
            swap(b[i],b[j]);
            swap(num[i],num[j]);
            inc(i); dec(j);
        end;
    end;
    if i<high then qs(i,high);
    if 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 ];
    while i<j do
    begin
        while ans[i]<xx do inc(i);
        while ans[j]>xx do dec(j);
        if i<=j then
        begin
            swap(ans[i],ans[j]);
            inc(i); dec(j);
        end;
    end;
    if i<high then qs1(i,high);
    if j>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> then
    begin
        x:=(queb[tot-]-b[i])/(a[i]-quea[tot-]);
        while (tot>) and (x<=quex[tot]) do
        begin
            dec(tot);
            x:=(queb[tot-]-b[i])/(a[i]-quea[tot-]);
        end;
    end;
    inc(tot);
    quea[tot]:=a[i];
    queb[tot]:=b[i];
    quex[tot]:=(queb[tot-]-b[i])/(a[i]-quea[tot-]);
    ans[tot]:=num[i];
end;
     
begin
    read(n);
    for i:= to n do read(a[i],b[i]);
    for i:= to n do num[i]:=i;
    qs(,n);
    quea[]:=a[]; queb[]:=b[];
    quex[]:=-maxlongint; ans[]:=num[];
    tot:=;
    for i:= to n do insert(i);
    qs1(,tot);
    for i:= to tot do write(ans[i],' ');
end.

bzoj 1007 凸壳的更多相关文章

  1. BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)

    题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l ...

  2. BZOJ 3672 [Noi2014]购票 (熟练剖分+凸壳维护)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3672 题意:给出一棵有根树(1为根),边有长度.每个点u有三个属性(len[u], ...

  3. bzoj 3165: [Heoi2013]Segment 动态凸壳

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 202  Solved: 89[Submit][Stat ...

  4. BZOJ 1007 水平可见直线 | 计算几何

    BZOJ 1007 水平可见直线 题面 平面直角坐标系上有一些直线,请求出在纵坐标无限大处能看到哪些直线. 题解 将所有直线按照斜率排序(平行的直线只保留最高的直线),维护一个栈,当当前直线与栈顶直线 ...

  5. AC日记——[HNOI2008]水平可见直线 bzoj 1007

    1007 思路: 维护一个下凸壳: 用单调栈来维护这玩意儿: 先将斜率排序: 然后判断栈顶元素和当前元素的交点x是否小于栈顶元素和栈顶上一个元素的交点x: 注意: 人神共愤的精度问题和输出空格问题: ...

  6. [CF1137E]Train Car Selection[维护凸壳]

    题意 题目链接 分析 首先,如果加到了车头所有之前的车厢都不可能成为答案. 如果加到了车尾,容易发现对于 \(x_2<x_3\) 而言在某个时刻会出现 2 又比 3 优的情况. 具体来讲,如果存 ...

  7. [BZOJ2726][SDOI2012]任务安排(DP+凸壳二分)

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1580  Solved: 466[Submit][Statu ...

  8. ZOJ 3937 More Health Points (2016 浙江省赛 B题,可持久维护凸壳)

    题目链接  2016 ZJCPC Problem B 题意  CF 660F的树上版本. 其他做的方法都差不多,关键是把凸壳放到树上. 每次确定扔掉几个元素的时候直接$O(1)$修改(先不清楚这个位置 ...

  9. [Gym101982M][思维好题][凸壳]Mobilization

    [gym101982M][思维好题][凸壳]Mobilization 题目链接 20182019-acmicpc-pacific-northwest-regional-contest-div-1-en ...

随机推荐

  1. Linux上jdk的安装(CentOS6.5)

    centos openjdk 安装 http://www.cnblogs.com/ilahsa/archive/2012/12/11/2813059.html 知CentOS6.5桌面版默认安装的是J ...

  2. crm踩坑记(一)

    目录 antd es6 Object.entries() Object.keys() Object.getOwnPropertyNames() 很神奇的用法!!! eslint 傻逼 其他 参考 an ...

  3. list 集合addAll 和 add 方法小坑

    1.问题 我们经常会遍历 list集合,在遍历的过程中,如果在遍历的过程中添加了 add()  或者 addAll() 方法修改了遍历的list列表,那么会报错. 代码演示: List<Inte ...

  4. QC的使用学习(三)

    一.需求转换测试 1.自动转换方法: (1)将最底层的子需求转换成设计步骤:即将最底层的子要求转换成测试用例的步骤. (2)将最底层的子要求转换成测试:即将最底层的要求转换成单个测试用例(建议使用) ...

  5. 3、shader深度测试(Cull、ZWrite 、ZTest )

    剔除和深度测试是渲染法线中的一个流程 Cull:默认情况下,Unity中给的所有Shader都是单面的,它都把反面的渲染给关闭掉了,如果你在开发的过程中需要使用到双面,只要把cull关闭(off)即可 ...

  6. 开发react的一些记录

    1.keyboard事件返回的对象SyntheticKeyboardEvent全部是null 解决方法:SyntheticKeyboardEvent的type,which,timeStamp可以得到你 ...

  7. Python 3 学习笔记之——标准库概述

    1. 操作系统接口 os 模块提供了一些与操作系统相关联的函数. >>> os.getcwd() # 获取当前工作目录 '/home/senius' >>> os. ...

  8. java设计模式之门面模式以及在java中作用

    门面模式在Tomcat中有多处使用,在Request和Response对象封装,从ApplicationContext到ServletContext封装中都用到了这种设计模式. 一个系统可以有几个门面 ...

  9. Windows server 2012 R2开机进入cmd,关闭后黑屏问题

    原因分析: 因为自己在卸载IIS的时候,不小心卸载了.net framework,系统没有了图形界面(由完整模式Full变为了核心模式core),需要重新恢复.net framework4.5. 解决 ...

  10. HTTP 知新

    REST 先从 REST 的角度来看看 HTTP 协议规范, URL:需要操作的对象,也就是资源 HTTP method:我要对该对象做什么(POST 增.DELETE 删.GET 查.PUT 和 P ...