# 111 選手班 - 競程入門 ###### tags: `宜中資訊` `CP` ## 自我介紹 [FB](https://www.facebook.com/Ccucumber12/) ## 競程介紹 - 競技程式 (Competitive Programming) - 題型 - 技能 - [List](https://hackmd.io/@Ccucumber12/rkrPMogS_) - 資料結構 - 演算法 - 技巧 - 思考 - 經驗 - 分析 - 用途 - 興趣 - 動腦 - 未來 - 實際應用 - 賽制 - OI 制 - ICPC 制 - 題型 - Batch (傳統題) - Output Only (輸出題) - Communication (互動題) - TwoSteps (通信題) - 評分 - Special Judge - 聯集給分 - 連續給分 - 結果 - AC (Accept) - WA (Wrong Answer) - TLE (Time Limit Exceeded) - MLE (Memory Limit Exceeded) - RE (Runtime Error) - CE (Compile Error) ## 競賽列表 ### 臺灣 - 8: 成大暑期高中程式邀請賽 - 8: YTP - 8: ISSC - 10: HP Codewars - 11: NPSC - 8~12: 學科能力競賽 - 校內 - 東區 - 全國 - 3~5: 資訊奧林匹亞 - 初選 - 1! 2! 3! ### Online - Google Code Jam - Google Kick Start - Facebook Hacker Cup - Codeforces - AtCoder - USACO ## 資源 ### 網路資源 [便宜的演算法比賽網路資源整理](https://hackmd.io/@pr3pony/HysEHoYe8?fbclid=IwAR2GaSpKV-wpHesS2BATwYrRDa_cFnBo7F78p6DDbXrj8kdXdk5T0HKovJE) - [從零開始的演算法競賽入門教學](https://emanlaicepsa.github.io/) - [cppreference](https://en.cppreference.com/w/) - [cplusplus](https://cplusplus.com/) - [AP325](https://drive.google.com/drive/folders/10hZCMHH0YgsfguVZCHU7EYiG8qJE5f-m) - [板中資訊講義](https://sites.google.com/site/pcshic/zi-xun-pei-xun) - [附中資訊講義](https://cp.wiwiho.me/lessons/) - [建中資訊講義](https://tioj.ck.tp.edu.tw/articles?era=2021) - [宜中資訊講義?](https://vjudge.net/article/2291) - [IO wiki](https://oi-wiki.org/) - [演算法筆記](https://web.ntnu.edu.tw/~algo/) - [資訊之芽](https://www.csie.ntu.edu.tw/~sprout/algo2022/) - [CP Algorithms](https://cp-algorithms.com/#navigation) - [USACO Guide](https://usaco.guide/dashboard) - [CodeForces EDU](https://codeforces.com/edu/course/2) ### 營隊課程 - 資訊之芽 - APCSCamp (臺大) - PCCA Camp (交大) - IONCamp (清大) - IOICamp (臺大) - AA競程 ### Online Judge - 宜中 http://infor.ylsh.ilc.edu.tw/ - 中文難題(建中) https://tioj.ck.tp.edu.tw/ - 中文經典題(南一中) https://toj.tfcis.org/oj/info/ - 模板練習 https://judge.yosupo.jp/ - 線上競賽 https://atcoder.jp/ - 線上競賽 https://codeforces.com/ - OI題 https://oj.uz/ - 中文題庫 https://www.luogu.com.cn/ - 老題庫 https://onlinejudge.org/ - 老題庫 http://poj.org/ - 主題練習 https://cses.fi/problemset/ - 主題練習 https://csacademy.com/ - 數學趣題 https://projecteuler.net/archives ## 複雜度 ### 時間複雜度 - 大 $O$ 符號 - 1s $\approx 10^8$ - 常數 $O(1)$ - 線性 $O(n)$ - 指數 $O(2^n)$ ![](https://i.imgur.com/A3MLWfG.png) - STL 複雜度 - `strlen()` - `lower_bound(mp.begin(), mp.end(), k)` - `void func(vector<int> v){}` - `vector::erase()` - 均攤分析 - 遞迴剪枝 - 常數 - 函式本身 - `unordered_map` - `queue`、`vector` - 算法本身 - Segment Tree / Treap - Locality - quick sort / merge sort - Floyd-Warshall - 矩陣乘法 - 分治法 (std::sort) ### 空間複雜度 - `int`: 4 Bytes - 512 MiB $\to 512*2^{20}/4 = 134217728$ - 滾動陣列、動態開點、持久化技巧 ## 比賽策略 - 考前 - 平時 - 學習新技術 - 複習、練習 - virtual - 接近 - 不要碰新東西 - 複習模板 - 喇分 - 2020TOI pB ![](https://i.imgur.com/pddf68V.png) - 小測資 - 提示滿分解 - 時間策略 - **不要有 $0$ 分的題目** - 時間 - 讀完所有題目 - 不用從頭寫到尾 - 了解自己能力與目標 - 不要鬼打牆 - 子題與滿分解 - 心態 - 適時換題 - 不要管別人在幹嘛 - #相信 - 其他 - 讀題時標記難度想法 - 吃東西尿尿 - 最後一分鐘都可以翻盤 ## 你應該知道的東西 ### `*` 和 `&` #### 指標 (Pointer) `int *ptr = &k;` - 樹結構 - 動態記憶體 - Linked List #### 參考 (Reference) `int &ref = k;` - 簡化實作 - 副函式傳入參數 #### 解參考 (Dereference) `cout << *ptr << endl;` - 取得(指標 / 迭代器)的值 #### 取址 `int *ptr = &k` - 取得變數記憶體位址 ### 三元運算子 ```c= int a = 3 ; int n = (a % 2 == 1 ? 10 : 20) ; // n = 10 // <statement> ? <if true> : <if false> ``` ### Struct ```c= struct point { int x, y ; info (int _x, char _y) { x = _x ; y = _y ; } point operator+(const point &a) const { return point(x+a.x, y+a.y) ; } int square () { return x*x + y*y ; } }; ``` ### 位元運算 - OR: `|` - AND: `&` - XOR: `^` - NOT: `~` - shift: `<<` / `>>` ### 迭代器 (Iterator) - vector / set / map - next() / prev() ```c= #include<iostream> #include<iterator> #include<vector> using namespace std; int main(){ vector<int> ar = { 1, 2, 3, 4, 5 }; vector<int>::iterator ptr; for (ptr = ar.begin(); ptr < ar.end(); ptr++) cout << *ptr << " "; } ``` ### Stringstream ```c= #include <sstream> strinstream ss ; string s ; getline(cin, s) ; ss << s ; int n ; while(ss >> n) { cout << n << endl ; } ``` ### Random - rand() * - random_shuffle * - mt19937 ```c= #include <random> #include <chrono> unsigned seed = chrono::steady_clock::now().time_since_epoch().count(); mt19937 rng(seed); uniform_int_distribution<ll> dist(1, 1e18); int main(){ cout << rng() << endl; cout << dist(rng) << endl; shuffle(arr, arr+n, rng); } ``` ### Fstream ```c= #include <fstream> fstream fin, fout ; fin.open("file_in.txt", ios::in) ; fout.open("file_out.txt", ios::out) ; int n ; fin >> n ; fout << n + 1 << endl ; fin.close() ; fout.close() ; ``` ### C++ 11 - using - auto - range-based for - lambda - tie - tuple ## 常見錯誤 ### WA - int, long long 比較 - operator 計算順序 - `a >> 1 + 2` - `a & b == 1` - 未初始化、歸零 - 0 / 1-based - 輸出格式 ### RE - 戳到陣列外面 - 數學運算錯誤 (除以 $0$) - local array 大小 - undefined behavior - `int a[n];` - overflow - `1<<62` - 自定義 `sort` 出現等號 ```cpp bool cmp(int a, int b) { return a >= b; } ``` ### TLE - 想錯了、寫錯了、算錯了、看錯了 - 遞迴沒有終止 - 搞錯函式確切複雜度 ## 常見技巧 ### 輸入輸出優化 ```c= ios::sync_with_stdio(false); cin.tie(0) ; cout.tie(0) ; #define endl '\n' ``` ### Define ```c= #define F first #define S second #define ALL(v) v.begin(),v.end() #define rep(i,n) for(int i=0;i<(n);++i) #define REP(i,a,b) for(int i=(a);i<=(b);++i) ``` ### Debug ```c= #ifdef local #define debug(...) cerr<<"#"<<#__VA_ARGS__<<" = ";dbg(__VA_ARGS__); #else #define debug(...) template<typename T> void dbg(T x){ cerr<<x<<endl; } template<typename T, typename ...A> void dbg(T x, A ...y){ cerr<<x<<", "; dbg(y...);} ``` ### Assert ```c= assert(...); ``` ### Using ```c= using ll = long long using pii = pair<int,int> ; using pll = pair<ll, ll> ; ``` ### 常數 ```c= const int INF = 0x3f3f3f3f ; const ll LLINF = 0x3f3f3f3f3f3f3f3f ; const MOD = 1e9 + 7 ; ``` ### <bits/stdc++.h> - include all libraries - not always available ### Default Code - 線上賽 - 東區學科 - ICPC - https://pastebin.com/nft7fWe6 ### Type Casting ```c= int a = 1, b = 2 ; ll c = 1LL * a * b ; double d = 1.0 * b / a ; // 1.0f is float ll e = (1LL << 60) ; ``` ### EOF ```c= int n ; while(cin >> n) { // do something } ``` ```c= int n ; while(scanf("%d", &n) != EOF) { // do something } ``` ### 重複 T 次 ```c= void solve() { // solution } int main() { int T = 1 ; cin >> T ; while(T--) { solve() ; } } ``` ### 行尾空白 ```c= for(int i=0; i<n; ++i) { cout << a[i] << " \n"[i == n-1] ; } ``` ### 更好的選擇 | Good | Bad | | ------------ | ----------- | | double | float | | emplace_back | push_back | | n >>= 1 | n /= 2 | | global array | local array | | ++i | i++ | ## 指令編譯 `g++ -o a.out -fsanitize=address -g -Wall -Wextra -O2 file.cpp` - `-o a.out` 輸出檔名 - `-fsanitize=address -g` 告訴你哪裡戳到陣列外面 - `-Wall -Wextra` 更多警告 - `-O2` 優化 ## 出題 [關於出題 I](https://oi-wiki.org/contest/problemsetting/) [關於出題 II](http://dreamoon4.blogspot.com/2015/04/blog-post.html) - testlib.h - https://github.com/MikeMirzayanov/testlib - https://oi-wiki.org/tools/testlib/ - https://codeforces.com/testlib - TPS - https://github.com/ioi-2017/tps - CMS - https://cms-dev.github.io/ - https://github.com/melongist/CSL/tree/main/CMS - polygon - https://polygon.codeforces.com/ - https://oi-wiki.org/tools/polygon/ ## 其他可以學的東西 - 終端機指令 - Unix 系統 - python - 數學 / 英文 - 計算機概論 - Vim - markdown - LaTeX