首先明确一个概念

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

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

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

  1. /**************************************************************
  2.     Problem:
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Accepted
  6.     Time: ms
  7.     Memory: kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. var
  12.     n                       :longint;
  13.     a, b, num               :array[..] of longint;
  14.     quea, queb              :array[..] of longint;
  15.     tot                     :longint;
  16.     quex                    :array[..] of double;
  17.     ans                     :array[..] of longint;
  18.     i                       :longint;
  19.      
  20. procedure swap(var a,b:longint);
  21. var
  22.     c                       :longint;
  23. begin
  24.     c:=a; a:=b; b:=c;
  25. end;
  26.      
  27. procedure qs(low,high:longint);
  28. var
  29.     i, j, xx, yy            :longint;
  30. begin
  31.     i:=low; j:=high; xx:=a[(i+j) div ];
  32.     yy:=b[(i+j) div ];
  33.     while i<j do
  34.     begin
  35.         while (a[i]<xx) or (a[i]=xx) and (b[i]>yy) do inc(i);
  36.         while (a[j]>xx) or (a[j]=xx) and (b[j]<yy) do dec(j);
  37.         if i<=j then
  38.         begin
  39.             swap(a[i],a[j]);
  40.             swap(b[i],b[j]);
  41.             swap(num[i],num[j]);
  42.             inc(i); dec(j);
  43.         end;
  44.     end;
  45.     if i<high then qs(i,high);
  46.     if j>low then qs(low,j);
  47. end;
  48.  
  49. procedure qs1(low,high:longint);
  50. var
  51.     i, j, xx                :longint;
  52. begin
  53.     i:=low; j:=high; xx:=ans[(i+j) div ];
  54.     while i<j do
  55.     begin
  56.         while ans[i]<xx do inc(i);
  57.         while ans[j]>xx do dec(j);
  58.         if i<=j then
  59.         begin
  60.             swap(ans[i],ans[j]);
  61.             inc(i); dec(j);
  62.         end;
  63.     end;
  64.     if i<high then qs1(i,high);
  65.     if j>low then qs1(low,j);
  66. end;
  67.      
  68. procedure insert(i:longint);
  69. var
  70.     k                       :longint;
  71.     x                       :double;
  72. begin
  73.     if a[i]=quea[tot] then exit;
  74.     if tot> then
  75.     begin
  76.         x:=(queb[tot-]-b[i])/(a[i]-quea[tot-]);
  77.         while (tot>) and (x<=quex[tot]) do
  78.         begin
  79.             dec(tot);
  80.             x:=(queb[tot-]-b[i])/(a[i]-quea[tot-]);
  81.         end;
  82.     end;
  83.     inc(tot);
  84.     quea[tot]:=a[i];
  85.     queb[tot]:=b[i];
  86.     quex[tot]:=(queb[tot-]-b[i])/(a[i]-quea[tot-]);
  87.     ans[tot]:=num[i];
  88. end;
  89.      
  90. begin
  91.     read(n);
  92.     for i:= to n do read(a[i],b[i]);
  93.     for i:= to n do num[i]:=i;
  94.     qs(,n);
  95.     quea[]:=a[]; queb[]:=b[];
  96.     quex[]:=-maxlongint; ans[]:=num[];
  97.     tot:=;
  98.     for i:= to n do insert(i);
  99.     qs1(,tot);
  100.     for i:= to tot do write(ans[i],' ');
  101. 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. Android系统自带样式

    android:theme="@android:style/Theme.Dialog" 将一个Activity显示为能话框模式  android:theme="@andr ...

  2. vue循环绑定v-model

    直接上代码 结构: <repayInput v-if="formData" v-for="(item, index) in formData" :isPw ...

  3. 「题目代码」P1034~P1038(Java)

    P1034 C基础-求同存异 import java.util.*; import java.io.*; import java.math.BigInteger; public class Main ...

  4. python,批量生成指定格式的审核数据(传输参数格式为数组时)

    #思路#获取list长度(例如列表有20条数据,则生成20条数据),生成数组长度为list元素的数据,完成对列表20条数据的批量审核def createBatchData(self,str_in,li ...

  5. C# 删除文件错误 access denied

    使用以下代码正常删除整个文件夹内容时,报错如下: if (backupPathDir.Exists) { System.IO.DirectoryInfo di = new DirectoryInfo( ...

  6. 参加2018之江杯全球人工智能大赛 :视频识别&问答(四)

    很遗憾没有在规定的时间点(2018-9-25 12:00:00)完成所有的功能并上传数据,只做到写了模型代码并只跑了一轮迭代,现将代码部分贴出. import keras from keras.lay ...

  7. OpenPAI:大规模人工智能集群管理平台介绍及任务提交指南

    产品渊源: 随着人工智能技术的快速发展,各种深度学习框架层出不穷,为了提高效率,更好地让人工智能快速落地,很多企业都很关注深度学习训练的平台化问题.例如,如何提升GPU等硬件资源的利用率?如何节省硬件 ...

  8. BZOJ 2946 POI2000 公共串 后缀自动机(多串最长公共子串)

    题意概述:给出N个字符串,每个串的长度<=2000(雾...可能是当年的年代太久远机子太差了),问这N个字符串的最长公共子串长度为多少.(N<=5) 抛开数据结构,先想想朴素做法. 设计一 ...

  9. 软工实践Beta冲刺(2/7)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...

  10. weak_ptr打破环状引用

    转自:http://blog.csdn.net/malong777/article/details/48974559 weak_ptr是一种不控制对象生存周期的智能指针,它指向一个shared_ptr ...