2020ICPC·小米 網路選拔賽熱身賽K-Random Point in Triangle

狙擊美佐發表於2020-10-24

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)pE=max(SPAB,SPAC,SPBC),E

對 於 任 何 三 角 形 , 先 看 看 特 殊 的 等 邊 三 角 形 。 然 後 在 推 廣 到 任 意 三 角 形 ( A C M 需 要 猜 ! ) 對於任何三角形,先看看特殊的等邊三角形。然後在推廣到任意三角形(ACM需要猜!) ACM
在這裡插入圖片描述

O 點 為 三 角 形 A B C 的 內 心 。 所 以 對 於 p 的 位 置 的 選 取 , 只 需 要 在 三 角 形 的 一 半 , 然 後 一 半 即 可 。 即 在 三 角 形 O S B 中 選 取 。 O點為三角形ABC的內心。所以對於p的位置的選取,只需要在三角形的一半,然後一半即可。即在三角形OSB中選取。 OABCpOSB

然 後 構 造 下 圖 為 : 然後構造下圖為:
在這裡插入圖片描述
設 該 等 邊 三 角 形 的 邊 長 為 2 a , O N 為 y , N P 為 x , 則 根 據 相 似 可 得 : 設該等邊三角形的邊長為2a,ON為y,NP為x,則根據相似可得: 2aONyNPx

P H = 2 3 a + x + 3 3 y PH=\frac{2}{3}a+x+\frac{\sqrt 3}{3}y PH=32a+x+33 y
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=23 PH=33 a+23 x+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=21AHPG=33 a2+23 ax+21ay

根 據 上 圖 , P 點 的 y 可 在 [ 0 , a 3 a ] 中 選 取 , 所 以 x 可 以 在 [ 0 , 3 y ] 中 選 取 。 根據上圖,P點的y可在[0,\frac{\sqrt a}{3}a]中選取,所以x可以在[0,\sqrt 3y]中選取。 Py[03a a]x[03 y]

對 面 積 積 分 如 下 : 對面積積分如下:

∫ 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 03a dy03 y(33 a2+23 ax+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 P63 a218113 a23 a2
即 期 望 為 11 18 S A B C , 在 乘 以 36 得 22 S A B C 。 即期望為\frac{11}{18}S_{ABC},在乘以36得22S_{ABC}。 1811SABC3622SABC

把 等 邊 三 角 形 推 廣 到 任 意 三 角 形 , 雖 然 我 不 會 證 明 , 大 膽 猜 測 總 沒 錯 ! 把等邊三角形推廣到任意三角形,雖然我不會證明,大膽猜測總沒錯!

#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;
}


相關文章