AGC039D 题解
题目描述
给定在笛卡尔坐标系的单位圆上的\(N\)个点(圆心为\((0, 0)\))。第\(i\)个点的坐标为\((cos(\frac{2 \pi T_i}{L}), sin(\frac{2 \pi T_i}{L}))\)。
三个不同的点将在这\(N\)个点中等概率的随机,请求出这三个点构成的三角形的内切圆圆心的\(x\)坐标的数学期望和\(y\)坐标的数学期望。
约束条件
\(3 \leq N \leq 3000\)
\(N \leq L \leq 10^9\)
\(0 \leq T_i \leq L - 1\)
\(T_i < T_{i+1}\)
所有的输入的数都是整数。
测试点时间限制:4s
测试点空间限制:1024MB
题目解答
算法一
解题过程
首先,我们考虑一种内心的刻画方法(这种刻画方法在数学竞赛中被称为"鸡爪定理")。
设\(\triangle ABC\) 的内心为\(I\),\(AI\)与\(\triangle\) \(ABC\)的外接圆交于另一点\(M\),则\(BM = CM = IM\) 。
证明:由于$ \angle BAM = \angle CAM\(,故\) \angle BCM = \angle CBM\(,所以\)BM = CM\(。又因为\)\angle IBM = \angle CBM + \angle IBC = \frac{1}{2}(\angle CAB + \angle ABC) = \angle MAB + \angle ABI = \angle BIM\(,所以\)BM = MI$
(之后看这张图的时候\(B,C\)可能需要互换一下)
这样,如果我们固定了\(B,C\)两点,以及\(A\)在\(B,C\)与圆的哪一段弧上,我们就可以得到弧\(BC\)的中点\(M\)(\(M\)与\(A\)在\(BC\)异侧)。我们不能枚举\(A\)点,但是我们将\(I\)刻画为:\(M + (B - M) \cdot e^{i \angle AMB}\)。(解释:\((I - M) = (B - M) \cdot (\cos \angle AMB + i \sin \angle AMB)\))(这里我们使用了复平面的工具),那么\(M\)是固定的,\(B - M\)是固定的(即与\(A\)无关)。要求所有\(I\)的坐标之和,只需要知道\(e^{i \angle AMB}\)的和。虽然这个式子与\(A,B\)有关,但是与\(M,C\)均无关(圆周角相等)。
因此,我们先枚举\(B\),接着逆时针顺序枚举\(C\),在枚举的过程中顺便维护
<1> 从\(B\)逆时针到\(C\)的点\(A\)的数目。
<2> 对于从\(B\)逆时针到\(C\)经过的点\(A\),维护\(e^{i \angle AMB}\)的和(这个和与\(M\)的位置是无关的)。
如果我们固定了\(B,C\)的话,以及\(A\)在\(B,C\)与圆的哪一段弧上,可以算出\(M\)的值,也可以算出\(M\)对答案的贡献的次数。同时,\(B - M\)对每一个\(A\)是一样的,而\(e^{i \angle AMB}\)的和又是被维护出来的。这样,我们就可以以\(O(n^2)\)的复杂度算出内心的坐标和了。但是,每个内心被算了三次,而且我们最终答案是内心横纵坐标的期望,所以要将答案除以\(\frac{n(n - 1)(n - 2)}{2}\)
算法二
我们对称地考虑三个弧中点构成的三角形。设这三个点\(D,E,F\)对应的复数也是\(D,E,F\),则我们通过计算角度发现内心对于的复数就是\(D + E + F\)。
证明1:这个三角形的重心为\(\frac{D + E + F}{3}\),并且由欧拉线定理及比例关系容易得到垂心\(H = D + E + F\)
证明2: 只需证明\(H' = D + E + F\)时,\((H' - D)\)与\((E - F)\)垂直,而\((\vec{OE} + \vec{OF}) \cdot (\vec{OF} - \vec{OE}) = \lvert \vec{OF} \rvert ^2 - \lvert \vec{OE} \rvert ^2 = 0\),故\(D + E + F\)是\(\triangle DEF\)的垂心。
得到了这个结论过后,我们枚举两个点,以及它们对应的一段弧,计算出这段弧的中点以及不在这段弧上的点的个数,就可以得到这段弧中点的复数值在最终答案里面出现的次数,再将它们相加即可。
时间复杂度仍然为\(O(n^2)\)。
代码实现
#include <bits/stdc++.h>
using namespace std;
const int N = 3005;
const double PI = acos(-1), eps = 1e-10;
int n, L;
double alpha[N], ansx = 0.0, ansy = 0.0;
double midpoint (double x1, double x2) {
double len = x2 - x1;
if (len < -eps) len += 2.0 * PI;
len /= 2.0;
double mid = x1 + len;
if (mid >= 2.0 * PI - eps) mid -= 2.0 * PI;
return mid;
}
int main () {
scanf("%d%d", &n, &L);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
alpha[i] = 2.0 * PI * x / L;
}
for (int i = 0; i < n; i++) {
double nowx = 0.0, nowy = 0.0;
for (int j = (i + 1) % n, k = 0; j != i; j = (j + 1) % n, k++) {
double m = midpoint(alpha[j], alpha[i]), arg = alpha[j] - alpha[i];
double vecx = cos(alpha[i]) - cos(m), vecy = sin(alpha[i]) - sin(m);
ansx += cos(m) * k, ansy += sin(m) * k;
ansx += vecx * nowx - vecy * nowy, ansy += vecx * nowy + vecy * nowx;
if (arg < -eps) arg += 2.0 * PI;
nowx += cos(arg / 2.0), nowy += sin(arg / 2.0);
}
}
ansx /= 0.5 * n * (n - 1) * (n - 2), ansy /= 0.5 * n * (n - 1) * (n - 2);
printf("%.10lf %.10lf", ansx, ansy);
return 0;
}
AGC039D 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- mysql权限管理命令
#创建用户 create user 'songwp' IDENTIFIED BY '1234' #用户授权 GRANT ALL ON DB01.* TO 'songwp' #撤销权限 REVOKE A ...
- linx mysql安装
文章引用:https://www.cnblogs.com/shizhongyang/p/8464876.html 只做了少量修改,感谢博主 注:未防止混淆,这里都用绝对路径执行命令 除了文件内容中的# ...
- Python_faker (伪装者)创建假数据
faker (伪装者)创建假数据 工作中,有时候我们需要伪造一些假数据,如何使用 Python 伪造这些看起来一点也不假的假数据呢? Python 有一个包叫 Faker,使用它可以轻易地伪造姓名.地 ...
- SQL Server 数据库bak备份文件还原操作和mdf文件附加操作
前言:现在任何软件都离不开数据的支持,数据的价值是无价的,因此数据目前显得尤为重要,日常软件生产库的数据定时或实时备份必不可少,备份出的文件也需要进行验证,下边我将介绍SQL Server数据的的备份 ...
- Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!
前一篇<不要再说不会Spring了!Spring第一天,学会进大厂!>文章可点击下方链接进行回看. 不要再说不会Spring了!Spring第一天,学会进大厂! 今天将继续讲解Spri ...
- FairyGUI编辑器的和unity里的Obj对应关系
1.在FairyGUI官网上下载好unity的工程,用FairyGUI编辑器打开它的官方案例 2.在FairyGUI编辑器和Unity中,从一个最简单的示例"Bag"着手. ...
- 画echart图时,安卓手机正常,苹果手机上tooltip 在坐标轴下一层
问题: 解决: 在tooltip 中添加如下代码: tooltip:{ position:function(point, params , dom, rect, size){ dom.style.tr ...
- empty
等效于false的都是true
- ntfs和fat32的区别
ntfs和fat32是两种不同的磁盘文件系统格式,虽然他们有一定的相似点,但还是具有很大的差异.今天,小编就带大家了解一下ntfs和fat32的区别. 图1 :u盘 一.分区容量 fat32能够有效管 ...
- 自学linux——12.shell进阶
Shell进阶 当把在Windows中写好的脚本传到linux中使用时,在Windows下每一行结尾是\n\r,而Linux下则是\n,所以会多出来\r,在linux中运行脚本时,需执行: sed - ...