【CF528E】Triangles 3000(计算几何)
【CF528E】Triangles 3000(计算几何)
题面
CF
平面上有若干条直线,保证不平行,不会三线共点。
求任选三条直线出来围出的三角形的面积的期望。
题解
如果一定考虑直接计算这个三角形的面积,我们很难不去弄出这三个交点。
我们需要的是低于\(O(n^3)\)的复杂度,而\(O(n^3)\)的做法可以直接暴力枚举三条直线。
考虑向量计算面积的方法,对于一个在三角形\(\Delta ABC\)之外的点\(O\),我们可以有:
\]
这个证明不难,画图把每一部分的面积表示出来就很简单了。
接下来枚举一条直线,剩下点按照极角顺序依次加入,然后这个贡献可以拆成三个部分,而我们只算都在枚举的直线上的交点的贡献,在其他直线上的可以在其他时候算。
于是要求的就是这条直线和枚举的直线的交点与前面所有直线与枚举的直线的交点与\(O\)构成的向量的叉积。
叉积是:\((x1,y1)\times (x2,y2)=x1*y2-x2*y1\),
于是得到:\((x1,y1)\times (x2,y2)+(x1,y1)\times (x3,y3)=x1*(y2+y3)-y1*(x2+x3)\)
这个东西显然等于\((x1,y1)\times ((x2,y2)+(x3,y3))\),那么就可以很开心的前缀和了。
注意为了保证顺序正确,需要把所有的直线按照极角提前排序。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 3030
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n;double ans;
struct Vect{double x,y;}O,g[MAX];
struct Line{double a,b,c,ang;}L[MAX];
bool operator<(Line a,Line b){return a.ang<b.ang;}
Vect Intersection(Line a,Line b)
{
if(fabs(a.a)>1e-9)
{
double y=(b.c*a.a-a.c*b.a)/(a.b*b.a-a.a*b.b);
double x=-(a.c+a.b*y)/a.a;
return (Vect){x,y};
}
else
{
double x=(b.c*a.b-a.c*b.b)/(a.a*b.b-a.b*b.a);
double y=-(a.c+a.a*x)/a.b;
return (Vect){x,y};
}
}
double Cross(Vect a,Vect b){return a.x*b.y-a.y*b.x;}
Vect operator-(Vect a,Vect b){return (Vect){a.x-b.x,a.y-b.y};}
Vect operator+(Vect a,Vect b){return (Vect){a.x+b.x,a.y+b.y};}
bool cmp(Vect a,Vect b){return Cross(a,b)>=0;}
int main()
{
n=read();O=(Vect){1e7,1e7};
for(int i=1;i<=n;++i)
{
L[i].a=read(),L[i].b=read(),L[i].c=-read();
double x,y;
if(fabs(L[i].b)>1e-7)x=1,y=-L[i].a/L[i].b;
else y=1,x=-L[i].b/L[i].a;
L[i].ang=atan2(y,x);
}
sort(&L[1],&L[n+1]);
/*
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
for(int k=j+1;k<=n;++k)
{
Vect g[3];
g[0]=Intersection(L[i],L[j]);
g[1]=Intersection(L[j],L[k]);
g[2]=Intersection(L[k],L[i]);
ans-=(Cross(g[0],g[1])+Cross(g[1],g[2])+Cross(g[2],g[0]));
}
ans/=1.0*n*(n-1)*(n-2)/3;
printf("%.10lf\n",ans);ans=0;
*/
for(int i=1;i<=n;++i)
{
Vect s=(Vect){0,0};
for(int j=i%n+1;j!=i;j=j%n+1)
{
Vect a=Intersection(L[i],L[j]);
ans+=Cross(s,a);s=s+a;
}
}
ans/=1.0*n*(n-1)*(n-2)/3;
printf("%.10lf\n",ans);
return 0;
}
【CF528E】Triangles 3000(计算几何)的更多相关文章
- CF528E Triangles 3000
cf luogu 既然要求三角形面积,不如考虑三角形的面积公式.因为是三条直线,所以可以考虑利用三个交点来算面积,如果这个三角形按照逆时针方向有\(ABC\)三点,那么他的面积为\(\frac{\ve ...
- Codeforces 528E Triangles 3000 - 计算几何
题目传送门 传送点I 传送点II 传送点III 题目大意 给定$n$的平面上的直线,保证没有三条直线共点,两条直线平行.问随机选出3条直线交成的三角形面积的期望. 显然$S=\frac{1}{2}ah ...
- CodeForces 682E Alyona and Triangles (计算几何)
Alyona and Triangles 题目连接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/J Description You ar ...
- ACM学习历程——UVA10112 Myacm Triangles(计算几何,多边形与点的包含关系)
Description Problem B: Myacm Triangles Problem B: Myacm Triangles Source file: triangle.{c, cpp, j ...
- Codeforces Round #296 (Div. 1) E. Triangles 3000
http://codeforces.com/contest/528/problem/E 先来吐槽一下,一直没机会进div 1, 马力不如当年, 这场题目都不是非常难,div 2 四道题都是水题! 题目 ...
- POI 2018.10.21
[POI2008]TRO-Triangles https://www.cnblogs.com/GXZlegend/p/7509699.html 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积 ...
- hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
How Many Triangles 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5784 Description Alice has n poin ...
- hdu-5784 How Many Triangles(计算几何+极角排序)
题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 【计算几何】【极角排序】【二分】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem J. Triangles
平面上给你n(不超过2000)个点,问你能构成多少个面积在[A,B]之间的Rt三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调 ...
随机推荐
- 安装oracle11g服务端
1.将oracle11g压缩包 解压到D盘根目录下 2.打开解压出来的文件夹,以管理员身份运行setup 3.警告弹框点击“是(Y)” 4.在此步骤中,可以提供您的电子邮件,以获取有关Oracle安全 ...
- [Vue 牛刀小试]:第十三章 - Vue Router 基础使用再探(命名路由、命名视图、路由传参)
一.前言 在上一章的学习中,我们简单介绍了前端路由的概念,以及如何在 Vue 中通过使用 Vue Router 来实现我们的前端路由.但是在实际使用中,我们经常会遇到路由传参.或者一个页面是由多个组件 ...
- C++之重载覆盖和隐藏
继承体系下同名成员函数的三种关系 重载 在同一作用域内 函数名相同,参数列表不同(分三种情况:参数个数不同,参数类型不同,参数个数和类型都不同) 返回值类型可以相同也可以不同 重写(覆盖) 在不同作用 ...
- 性能分析-java程序篇之案例-工具和方法
1. 背景说明 线上服务响应时间超过40秒,登录服务器发现cpu将近100%了(如下图),针对此问题,本文说明排查过程.工具以定位具体的原因. 2. 分析排查过程 此类问题的排查,有两款神器可用,分别 ...
- Java方法之参数传递机制
目录 Java方法之参数传递机制 基本数据类型 引用数据类型 综合练习 总结 Java方法之参数传递机制 Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做 ...
- Java入门系列之包装类(四)
前言 上一节我们讲解了StringBuilder VS StringBuffer以及二者区别,本节我们来讲解包装类. 包装类 我们知道在Java中有8中基本数据类型,分为数值类型:byte.short ...
- css知识笔记:水平居中(别只看,请实操!!!)
css实现元素的水平居中. (尝试采用5W2H方法说明): 别只看,请实操!!! What: 1.这篇文档主要描述元素水平方向居中的几种最常见和最实用的几种方式,并说明优缺点. 2.写这篇文章的目的, ...
- liunx用户环境初始化脚本
liunx用户环境初始化脚本 编写生成脚本基本格式,包括作者,联系方式,版本,时间,描述等 [root@magedu ~]# vim .vimrc set ignorecase set c ...
- iperf 一个测试网络吞吐的工具
在分布式文件系统开发和测试过程中,我们经常需要测试真实的网络带宽,来进行估测分布式系统的传输性能,所以我们要对现有的网络进行测试:Iperf 是一个网络性能测试工具.IPerf可以测试最大的TCP和U ...
- centos7.6 创建磁盘格式化
fdisk /dev/vdb mkfs.ext4 /dev/vdb echo '/dev/vdb /sdata ext4 defaults 0 0' >> /etc/fstab mount ...