Trick: \(x\) 與各位數之和模 \(9\) 同餘(CF10D) st表 和 線段樹 可以存 gcd(CF10D) 註意函數增減性(CF1632D) dp 時若下標太大,可以調換下標和存儲的數值(CF1974E) 貪心不成立時,可以用反悔貪心(CF1974G) 乘法一般比加法更優(CF187 ...
Trick:
- \(x\) 與各位數之和模 \(9\) 同餘(CF10D)
st
表 和 線段樹 可以存gcd
(CF10D)- 註意函數增減性(CF1632D)
dp
時若下標太大,可以調換下標和存儲的數值(CF1974E)- 貪心不成立時,可以用反悔貪心(CF1974G)
- 乘法一般比加法更優(CF1872G)
- '(' 看成 \(+1\),')' 看成 \(-1\) (CF1976D)
註意點:
題目部分:
- 數組範圍 註意不要開錯(記得修改預設源)。
- 並查集 數組要開 兩倍。
- 翻譯 看不懂的話要自己翻。
- 題目中 沒用的信息 跳過不看。
- 子串 和 子序列 看清楚!
- 排列 有特殊性質。
- 要看 樣例解釋 。
代碼部分:
- 多測 不清空,爆零兩行淚。
dp
初始化 不要忘記(最好設成LONG_LONG_MAX
或LONG_LONG_MIN
!)。memset
最好 不要用,複雜度高,容易超時。- 判斷 相等 應是
==
。 max
和min
中前後的數據類型要相同。- 不能隨意 開
long long
,可能爆空間。 - 看數據範圍, 不開
long long
見祖宗! long long
也不夠了用__int128
,或手寫 高精。vector
最好 不要直接排序,複雜度高,可以用 索引 來排序。- 註意算術優先順序(加 括弧 )!
- 交互題記得輸出後要 清空(
fflush(stdout);
),並且不要用ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
來加速。 - 數組 越界 要特判,比如下標從 \(0\) 開始時
i-1
要特判一下。 - 迴圈 邊界 想清楚再寫。
- 圖論時的輸入有時從下標 \(2\) 開始讀入。
- 二分 邊界 不要判錯。
- 二分時 \(l+r\) 若超出
long long
範圍,可以用 \(mid=l+(r-l)/\) 來寫。 cf
的題 不要 寫unordered_map
,只能用map
,因為有些大佬卡掉了unordered_map
。- 提交時記得 刪去 調試信息!
string
類如果寫了s=" "+s;
之類,n=s.size()
應寫在前面。st
表要調用log的 預處理!!
debug 部分:
- 樣例輸入不了,可能是
Dev-C++
死機了,可以打開 洛谷線上 IDE 或其他網站來寫。 - 如果用了
while(cin>>n)
之類的輸入,程式運行無法終止。如果輸入的類型是 整數,常用的辦法是換行後輸入\
或者什麼 字母,這樣輸入就會停止了,並且有輸出。或者 在迴圈中特判 \(n\) 為 \(-1\) 時結束,自己手動輸入 \(-1\) 即可。提交時記得 刪去。 - 沒有輸出,可能是死迴圈了。把
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
註釋掉,之後在遞歸里 輸出 每次的值。 dp
值不對,可以將dp
的表格 列印 出來。- 如果是交互題,可能是樣例本身不是最優。
演算法選擇:
數據範圍:
- \(n \le 10\) 時,考慮 暴力搜索 或 狀壓 dp。
- \(n \le 20\) 時,考慮 meet in the middle 或 狀壓 dp 優化。
- \(n \le 10^2\) 時,考慮 dp。
- \(n \le 10^3\) 時,考慮 暴力枚舉。
- \(n \le 10^5\) 時,考慮 貪心。
- \(n \le 10^9\) 時,考慮 二分 和 數學。
- \(n \le 10^{18}\) 時,考慮 數學。
題目描述:
- 最大值最小(最小值最大):二分、貪心。
- 最大得分和最小得分:貪心、
dp
。 - 修改、求區間最大值:線段樹、首碼和。