owned this note
owned this note
Published
Linked with GitHub
# 競賽老人經驗談
## 蔡旻諺
#### Jul 17, 2024
---
# 大綱
1. 自我介紹
2. 大學比賽旅程
3. 團隊分工是怎麼一回事?
4. 日常練習都要幹嘛?
5. 實際比賽會發生什麼事?
---
# 自我介紹
----
### 經歷
- 臺大資工系畢業,現就讀臺大資工所
- 八年程式競賽經驗
- 現已退役,轉職成線上競賽選手
- 臺大 ICPC 培訓班 2022-2024 助教
----
### 競賽成績
- ICPC World Finals 2023 13rd
- 其實實際上是 14th
- 2022 桃園站冠軍
- Codeforces: [baluteshih](https://codeforces.com/profile/baluteshih) (rating: 2531)
- Atcoder: [baluteshih](https://atcoder.jp/users/baluteshih) (rating: 2448)
- IOI 2019 銅牌
---
# 大學比賽旅程
----
- 高中時參加 IOI 拿了銅牌
- 臺灣國手平均實力銀牌起跳
- 復仇!
- 找了當年世界第 6 組隊
- 找了也有國手級實力但高三莫名不參加國手選拔的人組隊
- 組成了 BBQube: baluteshih/briansu/icube
----
- 聽起來是豪華陣容?
- 我們甚至大一進去就在校內賽拿第一
- 但當年的台北新竹站拿了第八
- **這還不是一支成熟的隊伍**
- 穩定性很差

----
- 大一下的我們,忙碌於課業,也沒什麼時間練習
- 結果到了大二也沒什麼成長,台北新竹站拿了第五
- 甚至校內賽莫名摔到第六
----
- 開始意識到問題,我們團隊中存在著弱點
- 擬定好分工
- 熟悉每個人擅長的題目
- 想好比賽策略
----
- 到了大三,我們在校內的每一場練習賽不是第一就是第二
- 我們自認已經成為有水準的隊伍
- 不過還是在正式賽中受壓力所苦,在台北站飲恨失常拿了第三
- 比完賽之後隊名改成 8BQube
----
- 大三下~大四上的這段期間,我自己把時間都拿去押在競賽上了
- 那年的桃園站題品品質並不是很好,幸好身經百戰的我們靠著穩定性守住了第一,成功晉級至心心念念的 World Finals
----
- 雖然這是一場「品質不好的比賽」,但我卻印象深刻
- 在封板時,我們的名次是第四,岌岌可危
- 但我們靠著經驗穩住了最後兩題的機會,與當年的最大競爭者分出了勝負
----

----
- 疫情和戰爭影響了 World Finals 的賽程
- 一路拖到 2024 四月,最終我們在世界決賽很殘念排名第十四,以 22 分鐘之差和獎牌擦身而過
- 不過還是一段令人開心的旅程
---
# 團隊分工是怎麼一回事?
----
- 找出每個人擅長的東西
- 找出每個人在團隊中的定位
----
### **比較**擅長什麼?
- baluteshih: 資料結構、計算幾何、字串[自動機]
- icube: 數學、構造、位元題、字串[hash]
- briansu: DP、需要細心的題目、字串[Suffix Array]
----
由於知道彼此擅長什麼,我們會在看出題目類型後直接把題目分配給對應的人處理
- 但不一定是直接把題目想都不想就扔給對方!
----
### 才不是只有題目類型
- baluteshih: 在觀察到關鍵的性質後,知道如何運用知識組合出正確的演算法
- icube: 擅長冷靜分析題目性質
- briansu: 擅長突破盲點、跳脫思維找到題目的重要性質
----
8BQube 的團隊特性就是合作解題 & 合作寫程式
- 時常有題目同時參雜著三個人的想法
- 時常有題目同時包含著兩個人的程式碼
----
### 不擅長什麼?
- baluteshih: 常常在思考題目的時候會陷入盲點
- icube: 寫程式的速度比較慢
- briansu: 不擅長記得經典題型
----
我習慣不太經過思考就講一堆想法出來
- 這時候比較冷靜的 icube 就會提醒我應該如何整理,甚至提醒我實作可以注意什麼
----
briansu 時常會講出題目的關鍵性質或方向
- 然後講到一半就會問我「這個子問題能不能做」
- :「蛤?那不是經典題嗎?」
----
團隊定位開始出現
- baluteshih
- 比較多話,負責分配工作或噴隨機想法
- 整理 codebook,並在腦海中記著各式經典題型的作法
- briansu
- 細心,在比較需要細節的題目能穩定發揮
- 聰明,團隊真正的智商擔當,可以在不具備一切知識的狀況下找到解題方向
- icube
- 比較冷靜,常負責幫另外兩個人驗解
- 在適當時機提醒隊友該注意的事情
- 擅長偏門知識
- 不寫程式
----
好的團隊合作,可以帶來更堅強的實力!
- 三個臭皮匠勝過一個諸葛亮
---
# 日常練習都要幹嘛?
----
## 個人實力
- 刷題
- 不要只是顧著 AC,要多思考一下如何解題
- 參加線上競賽:Codeforces、Atcoder
----
## 練習檢討
- 心得文
- 補題
----
## Codebook
- 模板怎麼用?
- 團隊不擅長寫什麼?
- 測試!

----
## 實作
- 日常練習寫的程式碼可故意寫久、寫漂亮一點
- 偶爾觀摩一下大神的 code
----
你會怎麼寫方格 BFS?
```cpp=
void bfs(int sx, int sy, int n, int m) {
queue<pair<int, int>> q;
q.push(make_pair(sx, sy));
vis[sx][sy] = 1;
while (!q.empty()) {
pair<int, int> u = q.front();
q.pop();
// x - 1, y
if (u.first >= 0 && !vis[u.first - 1][u.second]) {
q.push(make_pair(u.first - 1, u.second));
vis[u.first - 1][u.second] = 1;
}
// x, y - 1
if (u.second >= 0 && !vis[u.first][u.second - 1]) {
q.push(make_pair(u.first, u.second - 1));
vis[u.first][u.second - 1] = 1;
}
// x + 1, y
if (u.first + 1 < n && !vis[u.first + 1][u.second]) {
q.push(make_pair(u.first + 1, u.second));
vis[u.first + 1][u.second] = 1;
}
// x, y + 1
if (u.second + 1 < m && !vis[u.first][u.second + 1]) {
q.push(make_pair(u.first, u.second + 1));
vis[u.first][u.second + 1] = 1;
}
}
}
```
----
哇,太長了吧,不怕打錯嗎?
- 試試這樣
----
```cpp=
bool check(int x, int y, int n, int m) {
if (x < 0 || x >= n || y < 0 || y >= m || vis[x][y]) return false;
return true;
}
void bfs(int sx, int sy, int n, int m) {
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
queue<pair<int, int>> q;
q.push(make_pair(x, y));
while (!q.empty()) {
pair<int, int> u = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
if (check(u.first + dx[i], u.second + dy[i], n, m)) {
q.push(make_pair(u.first + dx[i], u.second + dy[i]));
vis[u.first + dx[i]][u.second + dy[i]];
}
}
}
```
----
還是太長?
- 懂一點語法
----
```cpp=
void bfs(int sx, int sy, int n, int m) {
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
queue<pair<int, int>> q;
auto push = [&](int x, int y) {
if (x < 0 || y < 0 || x >= n || y >= m || vis[x][y]) return;
q.emplace(x, y);
vis[x][y] = 1;
};
push(sx, sy);
while (!q.empty()) {
auto [x, y] = q.front();
q.pop();
for (int i = 0; i < 4; ++i)
push(x + dx[i], y + dy[i]);
}
}
```
----
個人實力也是很重要的

---
# 實際比賽會發生什麼事?
----
### 比賽策略
- 誰負責讀題目?
- 誰負責寫程式?
- 何時看計分板?
----
面對毫無頭緒的問題的時候要怎麼開始思考?
- 討論,也許你的隊友腦中有關鍵的東西但他不會用,也許這個人就是你
- 空機 -> 打表
----
卡題的時候怎麼評估?
- 放著,因為現在想不到就是想不到
- 不要讓一題影響到全局,也是只是當下陷入了盲點,過一陣子再回來想
----
比賽中卡住要怎麼把狀態拉回來?
- 隊友之間要互相穩定情緒
- 不知道錯什麼
- 印 code debug
- 螢幕分兩半在旁邊看
- 對拍
- 有機會的話,開新題給自己自信
- 吃東西上廁所
----
跟隊友意見不同的時候要怎麼辦?
- 相信隊友...?
- 在賽場上沒有那麼多時間給你們辯論
- 賽後檢討
----
計分板
- 用來找到能做的題目
- 有時候不會做的題目看到一堆人過就會莫名找到解法
----
測機
- 了解本地 & judge 端的差別
- 熟悉鍵盤
----
比賽很吃臨場反應
- 總是會有突發狀況
- 經驗很重要,團練很重要
---
Q & A