一点注意事项(实时更新)

  1. 函数没事干不要封装着玩,会T的很惨。

  2. 不要对STL的速度抱有侥幸且不合理的幻想。

  3. 如果可以,尽量不用string。

  4. 请不要对自己的口胡能力过度自信,认真计算复杂度。

  5. 不要偷懒,过度依赖平板电视等外部库的模板不利于青少年智力发展。

  6. 如果需要使用指针,请关注时空复杂度的变化。

  7. 请注意数组的循环边界,边界溢出的指针可能指向其他数组,这往往会导致其他的数组出现问题,使答案扑朔迷离。

  8. 多测请务必检查清空,同时尽量用循环避免T飞。

  9. 如果自己的for都能炸,请检查循环下标是否正确。

  10. 如编译出:表达式必须包含对象的指针类型,但它具有类型balabala。一般为变量名与数组重复问题。

  11. 如使用迭代器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应在函数内声明,否则在递归过程中会指向不连续的区间。
    }
    
  12. 尽量将变量或数组外提出函数,调用函数时多次声明会凭空增加复杂度,但也要注意上一条所说的问题。

  13. define关键字是非常暴力的直接替换,请注意代码中使用#define的优先级

  14. builtin_popcount()函数返回值为int,长整型注意使用builtin_popcountll()。

  15. 若需要快读,请检查字符读入的判断条件,也可直接使用isdigit()函数。

  16. 当题目涉及较大的数值相乘时,往往化乘为log,但注意log应相加以完成原来的相乘操作。

  17. 取模不能直接比较大小,类比16条化为log维护比较。

  18. memset的效率很低。

  19. multiset可重集的erase函数如果传参传的是“数值val”,它就会将集合中所有val全部删除,但如果传一个迭代器,它只会删除一个元素。

  20. 模数要取得恰当,如果涉及加法,最好再模一下。

  21. 请仔细阅读题面及数据范围,谢谢。

  22. 请注意比赛中的PDF等下发文件,否则会死得很惨。

  23. vector的最后一个位置为其size()函数减一。

  24. 字符串哈希前缀求解时不要忘记乘以进位base的len次方。

  25. 快读大数时可以每读一个字符就模一次。

  26. STL的许多函数都是左闭右开传参的。

  27. 多检查取模问题,防爆。

  28. 不论什么函数,一定要注意是否有有返回值,否则代码厌氧。

  29. 记得赋初值。

  30. 模意义下减法记得先加模数再取模。

  31. 一定要检查freopen写对了没!!!

  32. 二维前缀和或多维前缀和在使用时要记得边界减一。

  33. 初始化(尤其数论题)的函数中不要出现还没赋值的变量,如:

    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);
        }
    }
    
  34. 数论分块时,如有多个上界除数,记得取min。

  35. INT_MAX之类的宏不一定是要求自然溢出的数,如INT_MAX实际上等于1<<31后再加一。

  36. 请对数据范围敏感一点,多关注数据范围与算法之间的关系。

  37. 延迟标记记得清空,数据结构该赋0的要赋成0,别偷懒。

  38. 注意if语句是不是被分号隔断了。

  39. 自然溢出是对1<<64取模。

  40. 读入(尤其文件读入)尽量不要用裸的cin/cout。

  41. 读完题要有手模样例习惯,不然可能读错题。

  42. kruskal判联通用find()别用fa[]。

  43. 用SUB拿部分分时记得在main()里return 0;。

  44. 取最值时谨慎使用LLONG_MAX与INT_MAX。

  45. FHQ Treap 查前驱后继时记得关注是否有重复的值。

  46. tag的初始值注意一下。

  47. 一定要注意题目要的是"YES" 还是"Yes"还是"yes"。

  48. 线段树记得建树。

  49. 读入数据如果在1e7左右请打快读,不要关闭同步流。

  50. 可以将分数化简后存成pair以降低精度损失。

  51. 拆贡献,点数的k次方可以变成选k个点方案的线性组合。

  52. 注意线段树区间修改tag的初始化。

  53. 指数取余记得用 \(\phi(p)\) 作为模数。

  54. 数据范围若有零有整,可考虑状压质因子,如300内的质数有63个,指向long long状压,而700内质数有125个,指向int128状压。

  55. 一个快捷的取对数的方法:int logn = 31 - __builtin_clz(n);

  56. 关闭同步流后请手动flush,不然会出现很多问题。

  57. namespce中的变量一定记得初始化。

  58. 记一个常见但难发现的UB

  59. 记得打拍子。

  60. 树上问题多往重心/直径的特殊性质想想。

  61. unsigned long long读入时scanf标识符记得用llu。

  62. 取最值时别把加法加爆了。

  63. 递归函数里不要开数组,多小的数组都会撑爆栈。

  64. 考前记得看看本文。

  65. 变量名别用y1,std空间会重了。

  66. set的内置lower_bound函数才是O(log n)复杂度,直接使用是O(n)的。

  67. 出现"cout不明确"问题,将using namespace std删去保存文件再重新加上在保存即可。

  68. containing loop一般指向数组溢出。

  69. 考场提交代码注意后缀名,别写成".cpp.cpp"。

  70. 谋事在人,成事在天!

\(\cdots\)

posted @ 2023-07-24 08:38  Melting_Pot  阅读(77)  评论(0编辑  收藏  举报