--- 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`,他可能會幫你抓到一些邊界問題。