trick
cnblogs 2024-06-10 15:39:00 阅读 70
trick:
- \(x\) 与各位数之和模 \(9\) 同余(CF10D)
st
表 和 线段树 可以存gcd
(CF10D)- 注意函数增减性(CF1632D)
dp
时若下标太大,可以调换下标和存储的数值(CF1974E)- 贪心不成立时,可以用反悔贪心(CF1974G)
- 乘法总是比加法更优(CF1872G)
注意点:
题目部分:
- 数组范围注意不要开错(记得修改缺省源)。
- 并查集数组要开两倍。
- 翻译看不懂的话要自己翻。
- 题目中没用的信息跳过不看。
- 子串和子序列看清楚!
- 要看样例解释。
代码部分:
- 多测不清空,爆零两行泪。
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);
来加速cin
和cout
。 - 数组越界要特判,比如下标从 \(0\) 开始时
i-1
要特判一下。 - 循环边界想清楚再写。
- 图论时的输入有时从下标 \(2\) 开始读入。
- 二分边界不要判错。
- 二分时 \(l+r\) 若超出
long long
范围,可以用 \(mid =l+(r-l)/2\) 来写。 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
。 - 修改、求区间最大值:线段树、前缀和。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。