题意:给你一个不存在三线共交点的一次函数组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的更多相关文章

  1. 【CF528E】Triangles 3000(计算几何)

    [CF528E]Triangles 3000(计算几何) 题面 CF 平面上有若干条直线,保证不平行,不会三线共点. 求任选三条直线出来围出的三角形的面积的期望. 题解 如果一定考虑直接计算这个三角形 ...

  2. CF528E Triangles 3000

    cf luogu 既然要求三角形面积,不如考虑三角形的面积公式.因为是三条直线,所以可以考虑利用三个交点来算面积,如果这个三角形按照逆时针方向有\(ABC\)三点,那么他的面积为\(\frac{\ve ...

随机推荐

  1. li中下的a元素的字超出了li的宽度

    网站搬迁,给你带来的不便敬请谅解! http://www.suanliutudousi.com/2017/10/21/li%E4%B8%AD%E4%B8%8B%E7%9A%84a%E5%85%83%E ...

  2. Java架构师必看的10本书

    1.大型网站系统与JAVA中间件实践 本书围绕大型网站和支撑大型网站架构的Java中间件的实践展开介绍. 从分布式系统的知识切入,让读者对分布式系统有基本的了解:然后介绍大型网站随着数据量.访问量增长 ...

  3. 高级UI晋升之常用View(三)上篇

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将先从以下两个内容来介绍常用View: [RecycleView] [Ca ...

  4. CSS3-2d3d

    1.过渡(transition)操作谁,给谁加过渡 transition:要过渡的属性     花费时间    运动曲线    何时开始:    多组属性变化,还是用 逗号 隔开 transition ...

  5. 微信app支付返回-1的问题

    我也是被坑就当留个纪念 前两天查了各种关于微信app支付返回-1的都是ERR_COMM 问题然后各种 验证最后还是误解 第三天去验证了一下微信开放平台发现了问题 appid 不在同一个开放平台 项目之 ...

  6. Ubuntu 更新国内镜像源失败

    Ubuntu 更新国内镜像源失败 首先打开系统原来的/etc/apt/sources.list 查看,原来的仓库地址是 https 还是 http 如果是http那么说明本机的 CA 证书有问题,运行 ...

  7. boost asio tcp 多线程异步读写,服务器与客户端。

    // server.cpp #if 0 多个线程对同一个io_service 对象处理 用到第三方库:log4cplus, google::protobuf 用到C++11的特性,Windows 需要 ...

  8. vagrant ssh try

    Vagrantfile add Vagrant.configure("2") do |config| config.vm.network "private_network ...

  9. 数位dp——牛客多校H

    /* x[1,A] y[1,B] x^y<C 或 x&y>C 把ABC拆成二进制后按位进行数位dp dp[pos][s1][s2][f1][f2] 表示从高到低第pos位,条件一状 ...

  10. Delphi里面弹出对话框的方法

    1.procedure   ShowMessage(const   Msg:   string); 单元:Dialogsor   QDialogs 例子:showmessage( 'hello '); ...