2020ICPC·小米 网络选拔赛热身赛K-Random Point in Triangle 计算几何
#传送门: https://ac.nowcoder.com/acm/contest/8409/K
题意
给 3 个 点 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , 在 三 角 形 内 部 中 取 一 点 p , 设 E = m a x ( S P A B , S P A C , S P B C ) , 求 E 的 概 率 期 望 。 给3个点(x1,y1),(x2,y2),(x3,y3),在三角形内部中取一点p,设E=max(S_{PAB},S_{PAC},S_{PBC}),求E的概率期望。 给3个点(x1,y1),(x2,y2),(x3,y3),在三角形内部中取一点p,设E=max(SPAB,SPAC,SPBC),求E的概率期望。
对
于
任
何
三
角
形
,
先
看
看
特
殊
的
等
边
三
角
形
。
然
后
在
推
广
到
任
意
三
角
形
(
A
C
M
需
要
猜
!
)
对于任何三角形,先看看特殊的等边三角形。然后在推广到任意三角形(ACM需要猜!)
对于任何三角形,先看看特殊的等边三角形。然后在推广到任意三角形(ACM需要猜!)
O 点 为 三 角 形 A B C 的 内 心 。 所 以 对 于 p 的 位 置 的 选 取 , 只 需 要 在 三 角 形 的 一 半 , 然 后 一 半 即 可 。 即 在 三 角 形 O S B 中 选 取 。 O点为三角形ABC的内心。所以对于p的位置的选取,只需要在三角形的一半,然后一半即可。即在三角形OSB中选取。 O点为三角形ABC的内心。所以对于p的位置的选取,只需要在三角形的一半,然后一半即可。即在三角形OSB中选取。
然
后
构
造
下
图
为
:
然后构造下图为:
然后构造下图为:
设
该
等
边
三
角
形
的
边
长
为
2
a
,
O
N
为
y
,
N
P
为
x
,
则
根
据
相
似
可
得
:
设该等边三角形的边长为2a,ON为y,NP为x,则根据相似可得:
设该等边三角形的边长为2a,ON为y,NP为x,则根据相似可得:
P
H
=
2
3
a
+
x
+
3
3
y
PH=\frac{2}{3}a+x+\frac{\sqrt 3}{3}y
PH=32a+x+33y
P
G
=
3
2
P
H
=
3
3
a
+
3
2
x
+
1
2
y
PG=\frac{\sqrt 3}{2}PH=\frac{\sqrt3}{3}a+\frac{\sqrt 3}{2}x+\frac{1}{2}y
PG=23PH=33a+23x+21y
则 E = S P A C = 1 2 ∗ A H ∗ P G = 3 3 a 2 + 3 2 a x + 1 2 a y 则E=S_{PAC}=\frac{1}{2}*AH*PG=\frac{\sqrt3}{3}a^2+\frac{\sqrt 3}{2}ax+\frac{1}{2}ay 则E=SPAC=21∗AH∗PG=33a2+23ax+21ay
根 据 上 图 , P 点 的 y 可 在 [ 0 , a 3 a ] 中 选 取 , 所 以 x 可 以 在 [ 0 , 3 y ] 中 选 取 。 根据上图,P点的y可在[0,\frac{\sqrt a}{3}a]中选取,所以x可以在[0,\sqrt 3y]中选取。 根据上图,P点的y可在[0,3aa]中选取,所以x可以在[0,3y]中选取。
对 面 积 积 分 如 下 : 对面积积分如下: 对面积积分如下:
∫ 0 a 3 d y ∫ 0 3 y ( 3 3 a 2 + 3 2 a x + 1 2 a y ) d x = 11 36 a 4 \int_{0}^{\frac{\sqrt a}{3}}dy\int_{0}^{\sqrt 3y}(\frac{\sqrt3}{3}a^2+\frac{\sqrt 3}{2}ax+\frac{1}{2}ay)dx=\frac{11}{36}a^4 ∫03ady∫03y(33a2+23ax+21ay)dx=3611a4
而
P
点
在
该
区
域
的
选
取
面
积
为
3
6
a
2
,
期
望
为
11
18
3
a
2
,
而
等
边
三
角
形
的
面
积
为
3
a
2
而P点在该区域的选取面积为\frac{\sqrt 3}{6}a^2,期望为\frac{11}{18}\sqrt 3 a^2,而等边三角形的面积为\sqrt 3a^2
而P点在该区域的选取面积为63a2,期望为18113a2,而等边三角形的面积为3a2
即
期
望
为
11
18
S
A
B
C
,
在
乘
以
36
得
22
S
A
B
C
。
即期望为\frac{11}{18}S_{ABC},在乘以36得22S_{ABC}。
即期望为1811SABC,在乘以36得22SABC。
把 等 边 三 角 形 推 广 到 任 意 三 角 形 , 虽 然 我 不 会 证 明 , 大 胆 猜 测 总 没 错 ! 把等边三角形推广到任意三角形,虽然我不会证明,大胆猜测总没错! 把等边三角形推广到任意三角形,虽然我不会证明,大胆猜测总没错!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pdd;
#define INF 0x3f3f3f3f
#define lowbit(x) x & (-x)
#define mem(a, b) memset(a , b , sizeof(a))
#define FOR(i, x, n) for(int i = x;i <= n; i++)
// const ll mod = 998244353;
const ll mod = 1e9 + 7;
// const double eps = 1e-6;
// const double PI = acos(-1);
// const double R = 0.57721566490153286060651209;
void solve() {
ll x1, x2, x3, y1, y2, y3;
while(cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3) {
cout << abs(x1 * y2 - x2 * y1 + x3 * y1 - x1 * y3 + x2 * y3 - x3 * y2) * 11 << endl;
}
}
signed main() {
ios_base::sync_with_stdio(false);
//cin.tie(nullptr);
//cout.tie(nullptr);
#ifdef FZT_ACM_LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
signed test_index_for_debug = 1;
char acm_local_for_debug = 0;
do {
if (acm_local_for_debug == '$') exit(0);
if (test_index_for_debug > 20)
throw runtime_error("Check the stdin!!!");
auto start_clock_for_debug = clock();
solve();
auto end_clock_for_debug = clock();
cout << "Test " << test_index_for_debug << " successful" << endl;
cerr << "Test " << test_index_for_debug++ << " Run Time: "
<< double(end_clock_for_debug - start_clock_for_debug) / CLOCKS_PER_SEC << "s" << endl;
cout << "--------------------------------------------------" << endl;
} while (cin >> acm_local_for_debug && cin.putback(acm_local_for_debug));
#else
solve();
#endif
return 0;
}