CF528E Triangles3000
题意:给你一个不存在三线共交点的一次函数组a[i]x+b[i]y+c[i]=0。
问等概率选取三条直线,围成三角形的面积的期望。
n<=3000.
标程:
#include<bits/stdc++.h>
using namespace std;
int n;
double ans,x,y,X,Y;
struct node{int a,b,c;}p[];
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
if (p[i].b<) p[i].a=-p[i].a,p[i].b=-p[i].b,p[i].c=-p[i].c;//避免后面不等式的变号
}
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
if (-p[i].a*p[j].b<-p[j].a*p[i].b) swap(p[i],p[j]);
for (int i=;i<=n;i++)
{
X=Y=;
for (int j=i+,k=;k<n;k++,j++)
{
if (j>n) j=;
x=(double)(p[j].c*p[i].b-p[i].c*p[j].b)/(p[i].b*p[j].a-p[i].a*p[j].b);//求交点
y=(double)(p[j].c*p[i].a-p[i].c*p[j].a)/(p[i].a*p[j].b-p[i].b*p[j].a);//这样写对0有符号,可以避免被0除
ans+=x*Y-X*y;//叉积求平行四边形面积
X+=x;Y+=y;
}
}
printf("%.4lf\n",ans*/n/(n-)/(n-));
return ;
}
题解:叉积前缀和
最愚蠢的方法自然是n^3枚举直线。计算几何常用套路前缀和。将直线按照斜率排序,枚举直线a和直线b,统计斜率在[a,b]之间的三角形面积和。用叉积来求需要交点,一个交点为直线a和直线b的交点,另一个交点集合为直线a与中间直线们的交点(前缀和维护x坐标和,y坐标和)。
注意三角形的面积要通过三个顶点的两两的叉积来求。
时间复杂度O(n^2)。
附:CF官方题解还有一个超级牛逼的方法。外框一个矩形,那么三角形面积就等于矩形面积减去三块直线夹角夹成的四边形。每两条直线的夹角(有两个)夹成的四边形被统计多少次,也就是斜率在这个夹角范围内的直线条数,可以用叉积是否在其中。
CF528E Triangles3000的更多相关文章
- 【CF528E】Triangles 3000(计算几何)
[CF528E]Triangles 3000(计算几何) 题面 CF 平面上有若干条直线,保证不平行,不会三线共点. 求任选三条直线出来围出的三角形的面积的期望. 题解 如果一定考虑直接计算这个三角形 ...
- CF528E Triangles 3000
cf luogu 既然要求三角形面积,不如考虑三角形的面积公式.因为是三条直线,所以可以考虑利用三个交点来算面积,如果这个三角形按照逆时针方向有\(ABC\)三点,那么他的面积为\(\frac{\ve ...
随机推荐
- delphi文件后缀全解
delphi文件后缀全解 1. 项目文件(.dpr):Delphi项目文件,用于保存窗体.单元等的信息,以及程序运行的初始化代码等,这种文件实际上包含了Pascal源代码. 2. 单元文件(.pas) ...
- XX Russia Team Open, High School Programming Contest St Petersburg, Barnaul, Tbilisi, Almaty, Kremenchug, November 30, 2019
ContestLink easy: AFI medium-easy: BDH medium: CGKL ???: EJ A. Attractive Flowers 签到. B. Blocking th ...
- 47. List中特有的方法
集合的体系:--------------| Collection 单列集合的根接口----------| List 如果实现了List接口的集合类,该类具备的特点是:有序,可重复---------- ...
- SpringBoot 之 Mybatis 逆向工程
今天给大家介绍在 spring- boot 项目中如何使用 maven 插件逆向工程生成 Mybatis 代码. pom.xml 添加依赖和插件 <dependency> <grou ...
- VS 2015 Download
企业版:http://download.microsoft.com/download/B/8/F/B8F1470D-2396-4E7A-83F5-AC09154EB925/vs2015.ent_chs ...
- Java——单例模式初步
1.7 单例模式初步 好书推荐:java与模式 1.7.1 什么是设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构.编程风格.以及解决问题的思考方式.设计模式就像是经典的棋谱,不同的棋 ...
- 《DNS攻击防范科普系列2》 -DNS服务器怎么防DDoS攻击
在上个系列<你的DNS服务真的安全么?>里我们介绍了DNS服务器常见的攻击场景,看完后,你是否对ddos攻击忧心重重?本节我们来告诉你,怎么破局!! 首先回顾一下DDoS攻击的原理.DDo ...
- flutter 死亡红屏 隐藏
当组件报错的时候会出现红屏现象,解决办法是覆盖原有的ErrorWidget 用一个空白的组件去替换它 1.main.dart中进行修改 新增覆盖代码: void setCustomErrorPage( ...
- Go中的switch fallthrough
Go基础 switch sExpr { case expr1: some instructions case expr2: some other instructions case expr3: ...
- class4_Listbox 列表部件
最终的运行效果图: #!/usr/bin/env python# -*- coding:utf-8 -*-# --------------------------------------------- ...