一点注意事项(实时更新)
-
函数没事干不要封装着玩,会T的很惨。
-
不要对STL的速度抱有侥幸且不合理的幻想。
-
如果可以,尽量不用string。
-
请不要对自己的口胡能力过度自信,认真计算复杂度。
-
不要偷懒,过度依赖平板电视等外部库的模板不利于青少年智力发展。
-
如果需要使用指针,请关注时空复杂度的变化。
-
请注意数组的循环边界,边界溢出的指针可能指向其他数组,这往往会导致其他的数组出现问题,使答案扑朔迷离。
-
多测请务必检查清空,同时尽量用循环避免T飞。
-
如果自己的for都能炸,请检查循环下标是否正确。
-
如编译出:表达式必须包含对象的指针类型,但它具有类型balabala。一般为变量名与数组重复问题。
-
如使用迭代器iterator,请注意其指向的空间是否连续,如:
void dfs(int u,int f){ multiset<pair<int,int>>::iterator it=s[u].begin(); if(!fl[u]){ if(!pos) pos=u,res+=dep[u]; else res+=min(dep[pos]+dep[u]-2*dep[fa[u]],dep[u]),pos=u; fl[u]=1; } for(;it!=s[u].end()&&!s[u].empty();++it) dfs(it->second,u); // 本代码中的迭代器:it应在函数内声明,否则在递归过程中会指向不连续的区间。 }
-
尽量将变量或数组外提出函数,调用函数时多次声明会凭空增加复杂度,但也要注意上一条所说的问题。
-
define关键字是非常暴力的直接替换,请注意代码中使用#define的优先级
-
builtin_popcount()函数返回值为int,长整型注意使用builtin_popcountll()。
-
若需要快读,请检查字符读入的判断条件,也可直接使用isdigit()函数。
-
当题目涉及较大的数值相乘时,往往化乘为log,但注意log应相加以完成原来的相乘操作。
-
取模不能直接比较大小,类比16条化为log维护比较。
-
memset的效率很低。
-
multiset可重集的erase函数如果传参传的是“数值val”,它就会将集合中所有val全部删除,但如果传一个迭代器,它只会删除一个元素。
-
模数要取得恰当,如果涉及加法,最好再模一下。
-
请仔细阅读题面及数据范围,谢谢。
-
请注意比赛中的PDF等下发文件,否则会死得很惨。
-
vector的最后一个位置为其size()函数减一。
-
字符串哈希前缀求解时不要忘记乘以进位base的len次方。
-
快读大数时可以每读一个字符就模一次。
-
STL的许多函数都是左闭右开传参的。
-
多检查取模问题,防爆。
-
不论什么函数,一定要注意是否有有返回值,否则代码厌氧。
-
记得赋初值。
-
模意义下减法记得先加模数再取模。
-
一定要检查freopen写对了没!!!
-
二维前缀和或多维前缀和在使用时要记得边界减一。
-
初始化(尤其数论题)的函数中不要出现还没赋值的变量,如:
signed main(){ scanf("%lld %lld",&T,&k); init();//该函数不要放在scanf上面 while(T-->0){ scanf("%lld %lld",&n,&m); if(n>m) swap(n,m); int ed(0),ans(0); for(int st=1;st<=n;st=ed+1){ ed=min(n/(n/st),m/(m/st)); ans=(ans+(m/st)*(n/st)%p*(f[ed]-f[st-1]+p)%p)%p; } printf("%lld\n",ans); } }
-
数论分块时,如有多个上界除数,记得取min。
-
INT_MAX之类的宏不一定是要求自然溢出的数,如INT_MAX实际上等于1<<31后再加一。
-
请对数据范围敏感一点,多关注数据范围与算法之间的关系。
-
延迟标记记得清空,数据结构该赋0的要赋成0,别偷懒。
-
注意if语句是不是被分号隔断了。
-
自然溢出是对1<<64取模。
-
读入(尤其文件读入)尽量不要用裸的cin/cout。
-
读完题要有手模样例习惯,不然可能读错题。
-
kruskal判联通用find()别用fa[]。
-
用SUB拿部分分时记得在main()里return 0;。
-
取最值时谨慎使用LLONG_MAX与INT_MAX。
-
FHQ Treap 查前驱后继时记得关注是否有重复的值。
-
tag的初始值注意一下。
-
一定要注意题目要的是"YES" 还是"Yes"还是"yes"。
-
线段树记得建树。
-
读入数据如果在1e7左右请打快读,不要关闭同步流。
-
可以将分数化简后存成pair以降低精度损失。
-
拆贡献,点数的k次方可以变成选k个点方案的线性组合。
-
注意线段树区间修改tag的初始化。
-
指数取余记得用 \(\phi(p)\) 作为模数。
-
数据范围若有零有整,可考虑状压质因子,如300内的质数有63个,指向long long状压,而700内质数有125个,指向int128状压。
-
一个快捷的取对数的方法:
int logn = 31 - __builtin_clz(n);
-
关闭同步流后请手动flush,不然会出现很多问题。
-
namespce中的变量一定记得初始化。
-
记一个常见但难发现的UB。
-
记得打拍子。
-
树上问题多往重心/直径的特殊性质想想。
-
unsigned long long读入时scanf标识符记得用llu。
-
取最值时别把加法加爆了。
-
递归函数里不要开数组,多小的数组都会撑爆栈。
-
考前记得看看本文。
-
变量名别用y1,std空间会重了。
-
set的内置lower_bound函数才是O(log n)复杂度,直接使用是O(n)的。
-
出现"cout不明确"问题,将using namespace std删去保存文件再重新加上在保存即可。
-
containing loop一般指向数组溢出。
-
考场提交代码注意后缀名,别写成".cpp.cpp"。
-
谋事在人,成事在天!
\(\cdots\)