题目传送门

  vjudge的快速通道

  bzoj的快速通道

题目大意

  问在一个凸多边形内找一个点,连接这个点和所有顶点,使得与0号顶点,1号顶点构成的三角形是最小的概率。

  假设点的位置是$(x, y)$,那么可以用叉积来计算三角形的面积。

  这样可以列出$n - 1$个不等式。

  将每个化成形如$ax + by + c \leqslant 0$的形式。

  然后分类讨论($b = 0的时候需要特殊处理$)将它转换成二维平面上的半平面。

  接着做半平面交,算面积就好了。

Code

 /**
* bzoj
* Problem#4445
* Accepted
* Time: 288ms
* Memory: 20068k
*/
#include <algorithm>
#include <iostream>
#include <cassert>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
typedef bool boolean; const double eps = 1e-;
#define check(_s) cerr << _s << endl; inline int dcmp(double x) {
if (fabs(x) <= eps) return ;
return (x < ) ? (-) : ();
} typedef class Vector {
public:
double x, y; Vector(double x = 0.0, double y = 0.0):x(x), y(y) { }
}Point, Vector; ostream& operator << (ostream& os, Point a) {
os << "(" << a.x << ", " << a.y << ")";
return os;
} Vector operator + (Vector a, Vector b) {
return Vector(a.x + b.x, a.y + b.y);
} Vector operator - (Vector a, Vector b) {
return Vector(a.x - b.x, a.y - b.y);
} Vector operator * (double x, Vector a) {
return Vector(a.x * x, a.y * x);
} double cross(Vector a, Vector b) {
return a.x * b.y - a.y * b.x;
} double dot(Vector a, Vector b) {
return a.x * b.x + a.y * b.y;
} Point getLineIntersection(Point A, Vector v, Point B, Vector u) {
double t = (cross(B - A, u) / cross(v, u));
return A + t * v;
} typedef class Line {
public:
Point p;
Vector v;
double ang; Line() { }
Line(Point p, Vector v):p(p), v(v) {
ang = atan2(v.y, v.x);
} boolean operator < (Line b) const {
// return dcmp(cross(v, b.v)) > 0;
return ang < b.ang;
}
}Line; const int N = 1e5 + ; int n;
int st = , ed = , top;
Line *ls, *qs;
Point *ps; inline void init() {
scanf("%d", &n);
ps = new Point[(n << ) + ];
for (int i = ; i < n; i++)
scanf("%lf%lf", &ps[i].x, &ps[i].y);
} inline void build() {
int d;
Point cur, nxt, vec;
ls = new Line[(n << ) + ];
vec = ps[] - ps[];
ls[++top] = Line(ps[], vec);
double bx = vec.y, by = vec.x, bc = cross(vec, ps[]), nx, ny, nc;
for (int i = ; i < n; i++) {
cur = ps[i], nxt = ps[(i + ) % n], vec = nxt - cur;
nx = bx - vec.y, ny = by - vec.x, nc = bc - cross(vec, cur);
d = dcmp(ny);
if (!d) {
d = dcmp(nx);
if (!d) continue;
ls[++top] = Line(Point(-nc / nx, ), Vector(, -d)); } else {
nx /= ny, nc /= ny;
ls[++top] = Line(Point(, nc), Vector(-d, -nx * d));
}
ls[++top] = Line(cur, vec);
}
} boolean isCrossingOut(Line b, Line cur, Line a) {
assert (dcmp(cross(cur.v, a.v)));
// if (!dcmp(cross(cur.v, a.v))) return true;
Point p = getLineIntersection(cur.p, cur.v, a.p, a.v);
return dcmp(cross(p - b.p, b.v)) > ;
} inline void HalfPlaneIntersection(int n) {
sort(ls + , ls + n + );
qs = new Line[n + ];
for (int i = ; i <= n; i++) {
while (st < ed && isCrossingOut(ls[i], qs[ed], qs[ed - ])) ed--;
while (st < ed && isCrossingOut(ls[i], qs[st], qs[st + ])) st++;
qs[++ed] = ls[i];
if (st < ed && !dcmp(cross(qs[ed].v, qs[ed - ].v))) {
ed--;
if (dcmp(cross(qs[ed].p - ls[i].v, ls[i].v)) < )
qs[ed] = ls[i];
}
}
while (st < ed && isCrossingOut(qs[st], qs[ed], qs[ed - ])) ed--;
} inline double PolygonArea(Point *ps, int n) {
double rt = cross(ps[n], ps[]);
for (int i = ; i < n; i++)
rt += cross(ps[i], ps[i + ]);
return fabs(rt) / ;
} inline void solve() {
double all = PolygonArea(ps - , n);
build();
HalfPlaneIntersection(top);
// assert(st < ed - 1);
if (st >= ed - ) {
puts("0.0000");
return;
}
for (int i = st; i < ed; i++)
ps[i] = getLineIntersection(qs[i].p, qs[i].v, qs[i + ].p, qs[i + ].v);
ps[ed] = getLineIntersection(qs[ed].p, qs[ed].v, qs[st].p, qs[st].v);
printf("%.4f", PolygonArea(ps + (st - ), ed - st + ) / all);
} int main() {
init();
solve();
return ;
}

bzoj 4445 小凸想跑步 - 半平面交的更多相关文章

  1. 【BZOJ4445】[Scoi2015]小凸想跑步 半平面交

    [BZOJ4445][Scoi2015]小凸想跑步 Description 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸n边形,N个顶点按照逆时针从0-n-l编号.现 ...

  2. 4445: [Scoi2015]小凸想跑步 半平面交

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4445 题解: 设点坐标,利用叉积可以解出当p坐标为\((x_p,y_p)\)时,与边i- ...

  3. 【BZOJ4445】[SCOI2015]小凸想跑步(半平面交)

    [BZOJ4445][SCOI2015]小凸想跑步(半平面交) 题面 BZOJ 洛谷 题解 首先把点给设出来,\(A(x_a,y_a),B(x_b,y_b),C(x_c,y_c),D(x_d,y_d) ...

  4. 「SCOI2015」小凸想跑步 解题报告

    「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...

  5. Loj 2008 小凸想跑步

    Loj 2008 小凸想跑步 \(S(P,p_0,p_1)<S(P,p_i,p_{i+1})\) 这个约束条件对于 \(P_x,P_y\) 是线性的,即将面积用向量叉积表示,暴力拆开,可得到 \ ...

  6. loj #2008. 「SCOI2015」小凸想跑步

    #2008. 「SCOI2015」小凸想跑步   题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...

  7. BZOJ 4445 [Scoi2015]小凸想跑步:半平面交

    传送门 题意 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 $ n $ 边形,$ n $ 个顶点 $ P_i $ 按照逆时针从 $ 0 $ 至 $ n-1 $ 编号. ...

  8. 【bzoj4445 scoi2015】小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 nn 边形, nn 个顶点按照逆时针从 00 ∼ n - 1n−1 编号.现在小凸随机站在操场中的某个位置,标 ...

  9. [SCOI2015]小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...

随机推荐

  1. iOS UI基础-11.0 UINavigationController

    导航控制器 利用UINavigationController,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的“设置”应用 UINavigationController的使用 ...

  2. Response.Redirect & window.location.href

    对接中信的微信H5支付时,对方(其实是微信)需要对我们的域名进行授权,即,我方需向渠道报备支付域名,微信只认可由此域名发起的支付交易. 支付中心只提供了一套支付接口供下游系统访问.因为给渠道报备的域名 ...

  3. MySQL-UNIQUE

    什么是UNIQUE约束 可以使用 UNIQUE 约束确保在非主键列中不输入重复的值.尽管 UNIQUE 约束和 PRIMARY KEY 约束都强制唯一性,但想要强制一列或多列组合(不是主键)的唯一性时 ...

  4. FILE文件删除操作(删除指定文件夹下所有文件和文件夹包括子文件夹下所有文件和文件夹),就是删除所有

    2018-11-05  19:42:08开始写 选择 删除 1.FileUtils.java类 import java.io.File;//导入包 import java.util.List;//导入 ...

  5. 调用微信JS-SDK配置签名

    前后端进行分开开发: 1:后端实现获取 +++接口凭证:access_token (公众号的全局唯一接口调用凭据) ** GET 获取:https://api.weixin.qq.com/cgi-bi ...

  6. Vector集合——单列集合的“祖宗”类

    是实现可增长的对象数组:所以底层也是数组: 与collection集合不同的是,vector是同步的,意味着是单线程的,意味着效率低,速度慢, 所以在jdk1.2版本之后被ArrayList集合所取代 ...

  7. golang学习笔记5 用bee工具创建项目 bee工具简介

    golang学习笔记5 用bee工具创建项目 bee工具简介 Bee 工具的使用 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/instal ...

  8. java实现 HTTP/HTTPS请求绕过证书检测代码实现

    java实现 HTTP/HTTPS请求绕过证书检测代码实现 1.开发需求 需要实现在服务端发起HTTP/HTTPS请求,访问其他程序资源. 2.URLConnection和HTTPClient的比较 ...

  9. vue:vuex详解

    一.什么是Vuex? https://vuex.vuejs.org/zh-cn 官方说法:Vuex 是一个专为 Vue.js应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相 ...

  10. 结合sklearn的可视化工具Yellowbrick:超参与行为的可视化带来更优秀的实现

    https://blog.csdn.net/qq_34739497/article/details/80508262 Yellowbrick 是一套名为「Visualizers」的视觉诊断工具,它扩展 ...