博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1007: [HNOI2008]水平可见直线
阅读量:5122 次
发布时间:2019-06-13

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

把直线\(y=kx + b\)看成点\((k, b)\),然后一条直线有贡献当且仅当它在凸包上,和斜率优化思想类似

#include 
#include
#include
#include
const int MAXN = 50010;typedef long long LL;struct Point { int x, y, idx; explicit Point(int a = 0, int b = 0) { x = a, y = b; } inline bool operator < (const Point & b) const { return x == b.x ? y > b.y : x < b.x; } inline Point operator - (const Point & b) const { return Point(x - b.x, y - b.y); }} ps[MAXN];LL cross(const Point & a, const Point & b) { return static_cast
(a.x) * b.y - static_cast
(a.y) * b.x;}int n, hav[MAXN];int st[MAXN], top;void solve() { std::sort(ps + 1, ps + 1 + n); st[1] = 1; st[top = 2] = 2; for (int i = 3; i <= n; ++i) { while (top >= 2 && cross(ps[st[top]] - ps[st[top - 1]], ps[i] - ps[st[top]]) >= 0) --top; st[++top] = i; } for (int i = 1; i <= top; ++i) hav[ps[st[i]].idx] = true;}int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d%d", &ps[i].x, &ps[i].y), ps[i].idx = i; solve();// for (int i = 1; i <= n; ++i) ps[i].x = -ps[i].x;// solve(); for (int i = 1; i <= n; ++i) if (hav[i]) printf("%d ", i); putchar(10); return 0;}

转载于:https://www.cnblogs.com/daklqw/p/10361514.html

你可能感兴趣的文章
SROP
查看>>
【SP26073】DIVCNT1 - Counting Divisors 题解
查看>>
selenium+python自动化80-文件下载(不弹询问框)
查看>>
Libevent:6辅助函数以及类型
查看>>
URLEncoder编码
查看>>
git基本使用
查看>>
tcl之内容
查看>>
svn 版本升级的问题
查看>>
天气预报的Ajax效果
查看>>
OpenCV学习笔记:矩阵的掩码操作
查看>>
[置顶] export命令-linux
查看>>
产品管理:启示录 - 特约客户、产品验证、原型测试
查看>>
bash中将字符串split成数组的方法
查看>>
序列求和
查看>>
python3 连接HBase
查看>>
★ Flex を使って Scalable Vector Graphics とビットマップを描画する
查看>>
RegexDemo6
查看>>
C#-interface
查看>>
hdu4472
查看>>
Qt creator工程项目移植时因环境变换造成qmake错误的解决方案
查看>>