题目传送门

  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 设计模式-NSNotificationCenter 通知中心

    通知介绍 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 任何一个对象都可以向通知中心发布通知(NSNotification),描述 ...

  2. (已解决)Xcode 运行cocos2dx弹出内部错误对话框(Internal Error)

    cocos2dx未捕获的异常升高.选择“继续”继续运行在一个不一致的状态.选择“崩溃”停止应用和崩溃报告一个错误文件. 莫名其妙,代码没有报错,运行时却弹出(内部错误)对话框出来: 再看看崩溃的底层代 ...

  3. HTTP通信机制

    HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:  1. 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接, ...

  4. Oracle推进SCN系列:使用oradebug在mount状态下推进SCN

    环境:RHEL 6.5(x86-64) + Oracle 11.2.0.4 声明:推进SCN属于非常规恢复范畴,不建议非专业人员操作,否则后果自负. 需求:我这里演示下推进SCN 10W数量级,实际需 ...

  5. Opcode是啥以及如何使用好Opcache

    转载  https://www.zybuluo.com/phper/note/1016714 啥是Opcode? 我们在日常的PHP开发过程中,应该经常会听见Opcache这个词,那么啥是Opcode ...

  6. PE结构图示

  7. 强化学习---A3C

    Asynchronous Advantage Actor-Critic (A3C) 在RL任务中,我们本质上最终要学习的是策略(Policy) value-based方法:间接方法,即通过学习值函数( ...

  8. 《大话设计模式》c++实现 之工厂模式

    工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端 ...

  9. Rpgmakermv(24 )yep_coreengine

    ==左部为原文,右边我做了简要翻译=================================== Introduction and Instructions ================= ...

  10. vs远程调试 转http://www.cnblogs.com/magicchaiy/archive/2013/05/28/3088274.html

    远程调试应用场景 部署环境:ASP.NET(C#)+IIS+Win7 64 bit 很多公司的开发模式都是将开发机器和服务器分开,也就是开发一台机,服务器一台机.而测试人员会在服务器上录入测试数据,此 ...