易错总结

易错总结
(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;

用堆和栈判是否为空

image-20200912163847614

欧拉序求lca:

数组开两倍,循环用cnt而不是n

-1的二进制是全是1

里 有 tolower() 函数,将字符转化成小写

并查集:

注意先给 fa 赋初值

注意信息能不能路径压缩,不能的话选择按秩合并

!!!网络流

tot=1;

初始化for(int i=1;i<=N;i++)

注意是 NNNN

技巧

对于某些中间结果非常大但不会在答案中出现的题,可以用long double计算中间答案最后用long long输出

原文地址:https://www.cnblogs.com/ke-xin/p/14102425.html