---
image: https://i.imgur.com/k2bLWJT.png
tags: 演算法競賽, FHC
---
<style>
.markdown-body {
max-width: 88%;
}
</style>
# Facebook / Meta Hacker Cup (FHC / MHC)
> Last Update: Aug 26, 2022
官網:https://www.facebook.com/codingcompetitions/hacker-cup
雖然他名字裡有 Hacker,可是跟資安一點關係也沒有,是 ~~Facebook~~ Meta 辦的演算法競賽。
:::info
叫 Meta 感覺還是怪怪的,以下還是先用 FHC 當作簡稱ㄅ。
:::
### 賽程
FHC 分為以下五個回合:
1. Qualification Round
- 有 72 小時,你只要能 <b style="color:red">AC 其中一題</b>就可以進到 Round 1。
2. Round 1
- 有 24 小時,你只要<b style="color:red">分數達到標準</b>就可以進到 Round 2(標準會在賽前公布,通常是通過兩題就能夠晉級)。
3. Round 2
- 有 3 小時,<b style="color:red">前 500 名</b>可以進到 Round 3,而且如果你有<b style="color:blue">解出至少一題</b>且名次在<b style="color:blue">前 2000 名</b>就能拿到 T-shirt。
4. Round 3
- 有 3 小時,<b style="color:red">前 25 名</b>可以進到 Final Round,如果你的名次在<b style="color:blue">前 200 名</b>那衣服上還會有「Top 200」的徽章。
5. Final Round
- **還不確定是線上或線下舉行**,有 4 小時,有 $[200, 20\,000]$ 美元的獎金。
### 賽制
- 以下(圖 1)可以看到比賽的題目,每一題都有相應的配分,只要答對了就可以拿到該題的分數,且只有答對的題目才會計算罰時[^fhc-penalty]。有兩件事需要特別注意:按下 Submit 之後你只有<b style="color:orange"> 6 分鐘</b>的時間可以上傳 & 修改答案,以及<b style="color:orange">賽後才會檢查</b>你上傳的答案對不對(記分板會先當大家都是 AC)。請務必先檢查過上傳的檔案是不是你要的,畢竟$\small\overset{\text{FST}}{翻車}$的可能性很高。
- 你的排名會由分數(score)跟罰時(penalty)來決定,分數越高排名越前面,分數相同時則按罰時由小至大來決定排名。
- 值得注意的是,因為只有一次機會,所以罰時並不會因為你修改了上傳的檔案而額外增加(當然還是會以最後一次上傳的時間為準)。
[^fhc-penalty]: 罰時就是把所有有 AC 的題目的第一個 AC 的提交時間(比賽經過的時間)都加起來,如果在該次提交之前還有其他的非 CE 提交就再額外加一些時間。**在 FHC 裡你每題只會有至多一個 AC 的提交,且不會有額外的罰時。**
:::spoiler 圖 1 -- 2020 年 Qualification Round 題目
![](https://i.imgur.com/cwbpDW9.png)
:::
### 做題流程
1. 先到[這裡](https://www.facebook.com/codingcompetitions/hacker-cup)按 ![](https://i.imgur.com/Pa1XObn.png) 註冊,從 ![](https://i.imgur.com/DshDp4k.png =x72) 進到比賽裡面。
2. 按照題目敘述寫完程式之後,按下 ![](https://i.imgur.com/MYXgcTX.png) 按鈕,會出現以下畫面(圖 2),之後按 ![](https://i.imgur.com/5pj2tVu.png) 拿到比 Sample Input 多一點點的 Validation Input,接著用你的程式跑出他的答案並丟到 ![](https://i.imgur.com/pwEmtCe.png =x72) 欄位按下 ![](https://i.imgur.com/U8WqMIn.png),如果跳出以下畫面(圖 3)就代表範例通過了!
3. 接著可以戳這顆咚咚 ![](https://i.imgur.com/pBhgwdB.png),你會載下一份包含一個 .txt 的加密 .zip。
:::warning
到目前為止都還不會開始倒數計時,不過當你按下 ![](https://i.imgur.com/CD8zREp.png) 之後,**你只有 6 分鐘**可以處理「解壓縮 > 執行程式 > 得到輸出檔 > ![](https://i.imgur.com/LVTSo5B.png)」四個步驟,而且**沒有第二次機會**可以按,所以請絕對先準備好再按下按鈕!
:::
:::info
在按下 ![](https://i.imgur.com/CD8zREp.png) 之後可以選擇去用密碼解壓縮檔案,但也可以直接下載一份沒有密碼保護的 .txt 輸入檔。
個人認為直接重新載一份會更快,若是你的網路燒雞才會需要去解壓縮。
- 可以參考:https://youtu.be/kibe-92kcjc
:::
- 你需要上傳輸出檔(任何副檔名都可以)以及程式碼,檔名放什麼都可以,但盡量不要用英文以外的字元。
- 如果你的輸出檔格式不太對,你會得到 ![](https://i.imgur.com/QfMOhnq.png),這時就趕緊檢查你剛剛是不是傳錯了檔案,或是 debug 的程式碼忘了註解掉,並重新上傳。
- 如果得到的結果是 ![](https://i.imgur.com/B8OkE9Q.png) 那就代表說基本上沒事了,可以繼續下一題。
:::spoiler 圖 2 -- Validate Solution
![](https://i.imgur.com/mbejZyY.png =600x)
:::
:::spoiler 圖 3 -- Submit
![](https://i.imgur.com/IVDHvB3.png)
:::
### 程式碼模板
使用 `freopen("輸入檔檔名", "r", stdin)` 以及 `freopen("輸出檔檔名", "w", stdout)` 來進行檔案的輸入輸出。如果是使用 cmd 的人可以直接在編譯出執行檔後打 `A.exe < 輸入檔檔名 > 輸出檔檔名` 就好。
```cpp=
#include <bits/stdc++.h>
using namespace std;
void solve() {
/* todo */
int ans = 0;
cout << ans << "\n";
}
int main() {
freopen("A.in", "r", stdin);
freopen("A.out", "w", stdout);
int T;
cin >> T;
for (int test = 1; test <= T; ++test) {
cout << "Case #" << test << ": ";
solve();
}
return 0;
}
```
### 額外注意事項
- 常常會有圖論題讓你遞迴深度太深,本機會跑到 Runtime Error(實質上是 stack limit exceeded),這時候可以利用在編譯指令加上 `-Wl,--stack=268435456` 來解決這個問題(後面那串數字是給 stack 開的大小,單位是 byte,如果不夠可以再加上去)。
- maybe thiws cawn hewp uwu https://codeforces.com/blog/entry/95323
- 上傳 output 之後可以看一下你生出來的答案有沒有怪怪的(ex. 在答案 $\ge 0$ 的題目出現負數),可能可以抓到一些問題(ex. overflow)
- `-fsanitize` 是你的好幫手(?
- 可以試試 `#define _GLIBCXX_DEBUG 1`,他可能會幫你抓到一些邊界問題。