_bzoj1007 [HNOI2008]水平可见直线【单调栈】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1007
按斜率排序,去掉斜率相同时,截距较小的直线(即只保留该斜率下截距最大的直线)。若当前直线与栈顶直线的交点的x坐标<=栈顶直线与栈顶第二条直线的交点的x左边,则pop,直到前者大于后者为止,因为若小于等于,那么栈顶这条直线一定被覆盖。
#include <cstdio>
#include <algorithm> const int maxn = 50005; int n, tem_n, top, ori_n;
char book[maxn];
struct line {
long long k, b;
int id;
} a[maxn], stk[maxn];
struct point {
double x, y;
}; bool cmp(const line & aa, const line & ss) {
if (aa.k == ss.k) {
return aa.b > ss.b;
}
return aa.k < ss.k;
} int main(void) {
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%lld%lld", &a[i].k, &a[i].b);
a[i].id = i;
}
std::sort(a, a + n, cmp);
tem_n = 1;
for (int i = 1; i < n; ++i) {
if (a[i].k != a[i - 1].k) {
a[tem_n++] = a[i];
}
}
ori_n = n;
n = tem_n; for (int i = 0; i < n; ++i) {
while (top > 1 && (stk[top - 1].b - a[i].b) * (stk[top - 1].k - stk[top - 2].k) <= (stk[top - 2].b - stk[top - 1].b) * (a[i].k - stk[top - 1].k)) {
--top;
}
stk[top++] = a[i];
}
for (int i = 0; i < top; ++i) {
book[stk[i].id] = 1;
}
for (int i = 0; i < ori_n; ++i) {
if (book[i]) {
printf("%d ", i + 1);
}
}
return 0;
}
_bzoj1007 [HNOI2008]水平可见直线【单调栈】的更多相关文章
- BZOJ1007: [HNOI2008]水平可见直线(单调栈)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8638 Solved: 3327[Submit][Status][Discuss] Descripti ...
- bzoj1007: [HNOI2008]水平可见直线 单调栈维护凸壳
在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=-x; L3 ...
- bzoj1007 [HNOI2008]水平可见直线——单调栈
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1007 可以把直线按斜率从小到大排序,用单调栈维护,判断新直线与栈顶的交点和栈顶与它之前直线的 ...
- [HNOI2008]水平可见直线 单调栈
题目描述:在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=- ...
- bzoj1007/luogu3194 水平可见直线 (单调栈)
先按斜率从小到大排序,然后如果排在后面的点B和前面的点A的交点是P,那B会把A在P的右半段覆盖掉,A会把B在P的左半段覆盖掉. 然后如果我们现在又进来了一条线,它跟上一条的交点还在上一条和上上条的左边 ...
- 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: 7940 Solved: 3030[Submit][Sta ...
- BZOJ 1007: [HNOI2008]水平可见直线 栈/计算几何
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- 【BZOJ1007】[HNOI2008]水平可见直线 半平面交
[BZOJ1007][HNOI2008]水平可见直线 Description 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见 ...
随机推荐
- cors跨域深刻理解
1.跨域问题只出现在前端和后端不在同一个主机上.前后端在同一个主机上不会出现跨域问题. 2.浏览器的一种自我保护机制,不允许出现本地浏览器ajax异步请求访问127.0.0.1以外的系统,因为浏览器不 ...
- centos mysql错误信息处理
mysql_secure_installation 提示错误:Enter current password for root (enter for none):ERROR 1045 (28000): ...
- Android双向seekbar(带刻度)
※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/disso ...
- Solidworks drwdot文件如何打开,如何制作Solidworks工程图模板
1 直接把这个文件拖放进Solidworks窗口 2 文件-保存图纸格式,另存为模板(slddrt文件) 3 搜索"Solidworks工程图如何使用,替换图纸格式模板文件.doc& ...
- Win8系统如何在桌面行显示我的电脑
1 桌面右击-个性化 2 更改桌面图标-然后可以在桌面上显示需要的东西
- 微信小程序之 页面跳转 及 调用本地json的假数据调试
一.微信小程序 跳转页面 小程序页面有2种跳转,可以在wxml页面或者js中: (1)在wxml页面中: <navigator url="../index/index"> ...
- easyUI 验证控件应用、自己定义、扩展验证 手机号码或电话话码格式
easyUI 验证控件应用.自己定义.扩展验证 手机号码或电话话码格式 在API中 发现给的demo 中没有这个验证,所以就研究了下. 相关介绍省略,直接上代码吧! watermark/2/tex ...
- 【Mongodb教程 第一课 补加课】 Failed to connect to 127.0.0.1:27017, reason: errno:10061 由于目标计算机积极拒绝,无法连接
1:启动MongoDB 2014-07-25T11:00:48.634+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errn ...
- MongoDB 自己定义函数
定义 db.system.js.insert({ _id : "TestConcat", value : function TestConcat(s1, s2){ return s ...
- 1.5.4 HAVING子句
1.5.4 HAVING子句正在更新内容.请稍后