Codeforces 528E Triangles 3000 - 计算几何
显然$S=\frac{1}{2}ah$是不可用的。(压根感觉不可优化)
考虑向量的做法:$S = \frac{1}{2}(A \times B + B \times C + C\times A)$。(相当于把一个三角形拆成了三个以原点作为其中一个顶点的"有向"三角形)
于是考虑利用向量叉积对向量加法的分配律进行优化。
枚举第一条直线,剩下的直线按照极角序加入,不断计算交点和有向面积。
对于直线的方向,我是根据原点在直线的哪一侧决定的。(比如定向后,原点在它左侧)
然后画三条直线相交,讨论原点在哪,然后再讨论怎么计算有向面积。

画一张图仅供参考,1和2表示是交点被计算的顺序。
开心地发现原点在三角形内部的时候计算叉积的时候需要取相反数计入答案。
这很烦。所以取一个超级远的地方的点作为原点就可以成功避开了这个问题。
Code
/**
* Codeforces
* Problem#528E
* Accepted
* Time: 78ms
* Memory: 100k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; //Comparison of floating point constants
const double eps = 1e-;
//π
const double pi = acos((double)-); //Define the points and the vectors
typedef class Point {
public:
double x;
double y;
Point(const double x = 0.0, const double y = 0.0):x(x), y(y) { }
}Point, Vector; const Point O(1e7, 1e7); 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 * (Vector a, double b) {
return Vector(a.x * b, a.y * b);
} Vector operator * (double b, Vector a) {
return Vector(a.x * b, a.y * b);
} Vector operator / (Vector a, double b) {
return Vector(a.x / b, a.y / b);
} Vector operator - (Vector a) {
return Vector(-a.x, -a.y);
} int dcmp(double x) {
if(fabs(x) < eps) return ;
return (x < ) ? (-) : ();
} double Dot(Vector a, Vector b) {
return a.x * b.x + a.y * b.y;
} double Cross(Vector a, Vector b) {
return a.x * b.y - a.y * b.x;
} double Area(Point a, Point b, Point c) {
return fabs(Cross(b - a, c - a) / );
} Point getLineIntersection(Point A, Vector v, Point B, Vector u) {
Vector w = B - A;
double t = (Cross(w, u) / Cross(v, u));
return A + t * v;
} typedef class Line {
public:
Point p;
Vector v;
double ang;
int id; Line() { }
Line(int a, int b, int c, int id):id(id) {
if (!b) {
p = Point(c * 1.0 / a, );
v = Point(, );
} else {
p = Point(, c * 1.0 / b);
v = Point(-b, a);
}
if (Cross(O - p, v) > )
v = -v;
ang = atan2(v.y, v.x);
} boolean operator < (Line b) const {
return ang < b.ang;
}
}Line; ostream& operator << (ostream& os, Point p) {
os << "(" << p.x << " " << p.y << ")";
return os;
} int n;
Line *ls; inline void init() {
scanf("%d", &n);
ls = new Line[(n + )];
for (int i = , a, b, c; i <= n; i++) {
scanf("%d%d%d", &a, &b, &c);
ls[i] = Line(a, b, c, i);
}
} double res = 0.0;
inline void solve() {
sort(ls + , ls + n + );
// for (int i = 1; i <= n; i++)
// cerr << ls[i].p << " " << ls[i].v << " " << ls[i].ang << endl;
for (int i = ; i <= n; i++) {
Point sP(, ), P;
for (int j = i + ; j <= n; j++) {
P = getLineIntersection(ls[i].p, ls[i].v, ls[j].p, ls[j].v) - O;
// int d = dcmp(Cross(ls[i].v, ls[j].v));
res += Cross(sP, P);
sP = sP + P;
}
for (int j = ; j < i; j++) {
P = getLineIntersection(ls[i].p, ls[i].v, ls[j].p, ls[j].v) - O;
// int d = dcmp(Cross(ls[i].v, ls[j].v));
res += Cross(sP, P);
sP = sP + P;
}
}
printf("%.9lf", res * / n / (n - ) / (n - ));
} int main() {
init();
solve();
return ;
}
Codeforces 528E Triangles 3000 - 计算几何的更多相关文章
- 【CF528E】Triangles 3000(计算几何)
[CF528E]Triangles 3000(计算几何) 题面 CF 平面上有若干条直线,保证不平行,不会三线共点. 求任选三条直线出来围出的三角形的面积的期望. 题解 如果一定考虑直接计算这个三角形 ...
- Codeforces 15E Triangles 【组合计数】
Codeforces 15E Triangles Last summer Peter was at his granny's in the country, when a wolf attacked ...
- CodeForces 682E Alyona and Triangles (计算几何)
Alyona and Triangles 题目连接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/J Description You ar ...
- Codeforces Round #296 (Div. 1) E. Triangles 3000
http://codeforces.com/contest/528/problem/E 先来吐槽一下,一直没机会进div 1, 马力不如当年, 这场题目都不是非常难,div 2 四道题都是水题! 题目 ...
- Codeforces 15E Triangles - 组合数学
Last summer Peter was at his granny's in the country, when a wolf attacked sheep in the nearby fores ...
- ACM学习历程——UVA10112 Myacm Triangles(计算几何,多边形与点的包含关系)
Description Problem B: Myacm Triangles Problem B: Myacm Triangles Source file: triangle.{c, cpp, j ...
- CF528E Triangles 3000
cf luogu 既然要求三角形面积,不如考虑三角形的面积公式.因为是三条直线,所以可以考虑利用三个交点来算面积,如果这个三角形按照逆时针方向有\(ABC\)三点,那么他的面积为\(\frac{\ve ...
- Codeforces Gym 100733A Shitália 计算几何
ShitáliaTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.acti ...
- Codeforces Gym 100286A. Aerodynamics 计算几何 求二维凸包面积
Problem A. AerodynamicsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/co ...
随机推荐
- 基于Schema配置切面
使用基于Schema的切面定义后,切点.增强类型的注解信息从切面类中剥离出来,原来的切面类也就蜕变为真正意义上的POJO了. 1.一个简单切面的配置 基于Schema配置的切面示例: < ...
- JDK 5.0 注解知识快速进阶
1.了解注解 对于Java开发人员来说,在编写代码时,除了源程序外,还会使用Javadoc标签对类.方法或成员变量进行注释,一遍使用Javadoc工具生成和源代码配套的Javadoc文件,如@para ...
- 中国标准时间转换成YYY-MM-DD
export function changeDate(dateA) { let date; if (dateA) { if (dateA.toString().indexOf('GMT') > ...
- 25个常用PowerShell命令总结
尽管Windows PowerShell已经出现一段时间了,习惯命令行的管理员可能对了解PowerShell功能的基础很感兴趣. 下面我们看看能由Windows PowerShell完成的最常见的25 ...
- MySQL优化小结
数据库的配置是基础.SQL优化最重要(贯穿始终,每日必做),由图可知,越往上优化的面越小,最基本的SQL优化是最重要的,往上各个参数也没太多调的,也不可能说调一个innodb参数性能就会好多少,而动不 ...
- Xcode工程编译错误之iOS开发之Xcode9报错 Compiling IB documents for earlier than iOS7 is no longer supported.
概要: 在我们升级到Xcode9时,最低的编译版本为iOS8,但是在使用一些SDK的时候就会报出Compiling IB documents for earlier than iOS7 is no l ...
- Ecplise通过Git将项目提交到GitHub
一.参考https://blog.csdn.net/bendanany/article/details/78891804 二.注意点: 1.仓库名必须和项目名相同: 2.若提交出现Can't conn ...
- caffe中的卷积
https://www.zhihu.com/question/28385679 如上,将三维的操作转换到二维上面去做,然后调用GEMM库进行矩阵间的运算得到最后结果. 两个矩阵相乘,需要中间的那个维度 ...
- [摘抄] SFM 和 Visual SLAM
来自知乎: SFM和vSLAM基本讨论的是同一问题,不过SFM是vision方向的叫法,而vSLAM是robotics方向的叫法. vSLAM所谓的mapping,vision方向叫structure ...
- java 和 c++ 实现的各种基础数据结构和算法
https://github.com/phishman3579/java-algorithms-implementation https://github.com/xorz57/forest