【BZOJ 1007】 [HNOI2008]水平可见直线
【题目链接】:http://www.lydsy.com/JudgeOnline/problem.php?id=1007
【题意】
【题解】
这个人讲得很好
http://blog.csdn.net/outer_form/article/details/50623551
可以先看一下;
看完之后再看下面的;
根据上面的分析;
可以知道最后所求的线段围成的是一个凹的多边形;
可知相邻的两条边,
它们的交点的横坐标必然是递增的;
如下图;
在把直线按照斜率递增排序之后;
假设第i条直线是可见的;
那么设第i+1条直线(斜率变大了)与第i条直线的交点为A;
然后再设第i+2条直线与第i条直线的交点为B;
上图可以看出;
如果B的横坐标比A的横坐标小,那么i+1就是不可见的了;
相反,第i+2条直线是可见的了;
相反,如上图;
如果B的横坐标比A的横坐标大,
那么i,i+1,i+2就都是可见的了;
根据这个举例;
可以想见;
我们要维护相邻的边的交点的横坐标不下降;
即单调递增;
如果遇到直线i;
crossx(i,sta[top])<=crossx(sta[top],sta[top-1]);
则直接把sta[top]删掉;
因为它不可见了;
直到crossx(i,sta[top])<=crossx(sta[top],sta[top-1])不成立为止;
则在把i加入栈中;
让直线i和直线sta[top-1]相邻;
这样i和sta[top-1]之前的线就都是相邻的了(之前指的是队列的里面的线);
总之就是维护相邻的线的交点的横坐标不下降.
用单调队列搞就好.
【完整代码】
#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x)
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const double eps = 1e-8;
const int N = 5e4+100;
struct node
{
double k,a;
int id;
};
node bian[N],sta[N],zhan[N];
int n,tn,top;
bool bo[N];
bool cmp(node a,node b)
{
if (fabs(a.k-b.k)<eps)
return a.a>b.a;
else
return a.k < b.k;
}
/*
y1 = k1x+b1
y2 = b2x+b2
*/
double crossx(node a,node b)
{
double k1 = a.k,k2 = b.k,b1 = a.a,b2 = b.a;
return (b2-b1)/(k1-k2);
}
int main()
{
//freopen("F:\\rush.txt","r",stdin);
rei(n);
rep1(i,1,n)
{
scanf("%lf%lf",&bian[i].k,&bian[i].a);
bian[i].id = i;
}
sort(bian+1,bian+1+n,cmp);
tn = n;
n = 1;
sta[1] = bian[1];
rep1(i,2,tn)
if (fabs(bian[i].k-bian[i-1].k)>eps)
sta[++n] = bian[i];
rep1(i,1,n)
{
while (top)
{
if (top>1 && crossx(sta[i],zhan[top-1])<=crossx(zhan[top],zhan[top-1]))
top--;
else
break;
}
zhan[++top] = sta[i];
}
rep1(i,1,top)
bo[zhan[i].id] = 1;
n = tn;
rep1(i,1,n)
if (bo[i])
printf("%d ",i);
return 0;
}
【BZOJ 1007】 [HNOI2008]水平可见直线的更多相关文章
- bzoj 1007 [HNOI2008]水平可见直线(单调栈)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5120 Solved: 1899[Submit][Sta ...
- BZOJ 1007 [HNOI2008]水平可见直线
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4453 Solved: 1636[Submit][Sta ...
- 2018.07.03 BZOJ 1007: [HNOI2008]水平可见直线(简单计算几何)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Description 在xoy直角坐标平面上有n条直线L1,L2,-Ln, ...
- BZOJ 1007 [HNOI2008]水平可见直线 (栈)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7940 Solved: 3030[Submit][Sta ...
- BZOJ 1007: [HNOI2008]水平可见直线 栈/计算几何
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- BZOJ 1007: [HNOI2008]水平可见直线 平面直线
1007: [HNOI2008]水平可见直线 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则 ...
- bzoj 1007: [HNOI2008]水平可见直线 半平面交
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=1007; 题解 其实就是求每条直线的上半部分的交 所以做裸半平面交即可 #include ...
- bzoj 1007 : [HNOI2008]水平可见直线 计算几何
题目链接 给出n条直线, 问从y轴上方向下看, 能看到哪些直线, 输出这些直线的编号. 首先我们按斜率排序, 然后依次加入一个栈里面, 如果刚加入的直线, 和之前的那条直线斜率相等, 那么显然之前的会 ...
- BZOJ.1007.[HNOI2008]水平可见直线(凸壳 单调栈)
题目链接 可以看出我们是要维护一个下凸壳. 先对斜率从小到大排序.斜率最大.最小的直线是一定会保留的,因为这是凸壳最边上的两段. 维护一个单调栈,栈中为当前可见直线(按照斜率排序). 当加入一条直线l ...
- BZOJ 1007 [HNOI2008]水平可见直线 ——半平面交 凸包
发现需要求一个下凸的半平面上有几个交点. 然后我们把它变成凸包的问题. 好写.好调.还没有精度误差. #include <map> #include <ctime> #incl ...
随机推荐
- amazeui学习笔记一(开始使用4)--Web App 相关
amazeui学习笔记一(开始使用4)--Web App 相关 一.总结 1.桌面图标(Touch icon)解决方案:终极方案:link标签的rel和href属性: <link rel=&qu ...
- 【CS Round #46 (Div. 1.5) B】Letters Deque
[链接]h在这里写链接 [题意] 让你把一个正方形A竖直或水平翻转. 问你翻转一次能不能把A翻转成B [题解] 有说一定要恰好为1次. 并不是说A和B相同就一定不行. [错的次数] 2 [反思] 自己 ...
- Mycat快速入门
1.Mycat介绍 Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以 ...
- Dcloud课程5 php如何实现文件缓存技术(静态数据缓存)
Dcloud课程5 php如何实现文件缓存技术(静态数据缓存) 一.总结 一句话总结:保存在磁盘上的静态文件,用PHP生成数据到静态文件中.其实cookie和session使用的就是这样的技术,所以c ...
- 下拉列表,点击选择实现跳转链接 onchange="window.location=..."
<select onchange="window.location=this.value;"> <option value="a.html"& ...
- call,apply,求最大最小值,平均数等基础编程知识
CALL/APPLY.一些编程基础以及一些基础知识.正则 call.apply.bind 求数组的最大值和最小值: 数组排序(SORT的原理->localeCompare实现汉字比较),取头取尾 ...
- windows下安装wabt
windows下安装wabt 安装前准备cmake.mingw环境 安装cmake 安装mingw 步骤 # 1.克隆wabt源码 git clone https://github.com/WebAs ...
- 11.3 Android显示系统框架_最简单的surface测试程序
APP有一个surface(界面),其有多个buffer用来存放界面数据,这些buffer是向surfaceflinger申请的: 因此我们编写的surface测试程序步骤: (1)获得surface ...
- report_timing
report_timing -max_path 2 会报告两条路径,但不一定是最差的路径 report_timing -nworst 2 -max_path 2 会报告两条最差的路径
- js课程 4-11 表格如何实现隔行换色
js课程 4-11 表格如何实现隔行换色 一.总结 一句话总结:表格奇数行和偶数行判断,赋予不同的样式. 1.表格如何隔行换色? 表格奇数行和偶数行判断,赋予不同的样式. 21 <script& ...