易错总结
(upd:排版/内容混乱,敬请谅解)
所有题至少想30分钟再去下一题,想不出来就敲个暴力(别一直想正解)
每道题分配时间均匀——或者简单题能保证稳拿分的多一点时间检查对拍
最后时间
不要再轻易改代码(至少不要大改)查数组大小开得对不对,会不会MLE或RE; 查样例能不能过,会不会CE; 查相近变量是否写错(如l和L,i和j,ADD和Add); 简单再次读题,查是否有细节没有注意; 查文件名 以及freopen
写完代码自己先静态看一下
读题仔细,落实每一个变量的数据范围 ,看清先后(毒瘤出题人边权先读入),代码不要打错(比如n,m打反,抄错)
重视细节和特殊值,比如临界和一些不符合自己推出的普遍规律的,特判
多测不清空,爆零两行泪
看清有向图还是无向图
数组开大(tarjan一般开大5-10倍,线段树开4倍,连边的开2倍)
记得调用函数!!!(日常写了树剖不调用)
开 long long int和int乘起来如果爆long long 要强制转换
(long~long)左移要用(1ll)
不要傻哈哈全(memset),用多少清空多少,可以用个栈啥的
头文件要写全(不写vector本地过编译)
注意 0 一直乘的情况——死循环
不要所有函数都加Inline ,会MLE
少写while( n-- )....很大几率不过脑子就错了——写for准没事
树状数组那里最好写上(i)
搜索注意边界(例如矩形啥的别超过边界)
组合数记住一定是 $ frac{n!}{m!(n-m)!} $ 千万别忘记 (n-m)!
凡是要取模的题,每步取模.每有一步减法,必须加上模数防止炸负数 (a*b\%P) 应该是((a\%P*b\%P)\%P)
先排序再去重!!!
(i,j)不要打反
(dfs) :树的fa才有用 ; 连通块的话 用(vis)判是否访问过
结构体所有的变量就算不用也要赋初值为0,否则会随机赋值
三种遍历
前序遍历/先序遍历
void dfs(int x){
printf("%d
",x);
if(ls[x]) dfs(ls[x]);
if(rs[x]) dfs(rs[x]);
}
中序遍历
void dfs(int x){
if(ls[x]) dfs(ls[x]);
printf("%d
",x);
if(rs[x]) dfs(rs[x]);
}
后序遍历
void dfs(int x){
if(ls[x]) dfs(ls[x]);
if(rs[x]) dfs(rs[x]);
printf("%d
",x);
}
子串要求连续,子序列不要求连续
(double)后面要先写int类型的才能转换!!!
预处理 (lg)数组
lg[0]=-1;
for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
or
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
树上k级祖先
注意这里必须用int ,不能是unsigned int,因为这里 只有当i=-1才会跳出循环
for(int i=19;i>=0;i--)
if((1<<i)<=d) {
x=fa[x][i];
d-=(1<<i);
}
return x;
用堆和栈判是否为空
欧拉序求lca:
数组开两倍,循环用cnt而不是n
-1的二进制是全是1
并查集:
注意先给 fa 赋初值
注意信息能不能路径压缩,不能的话选择按秩合并
!!!网络流
tot=1;
初始化for(int i=1;i<=N;i++)
注意是 NNNN
技巧:
对于某些中间结果非常大但不会在答案中出现的题,可以用long double计算中间答案最后用long long输出