那些写码5分钟,调试2小时的岁月

ouuan

2018-02-11 20:40:19

Personal

其实就是错题集了..不会做或者立马知道怎么错的就不写了,那些WA一整页的,调试一个多小时的……都在这了。 从2018.2.11起(包括前几天做的题),长期更新,按做题时间降序排列 --- [CF1200F](http://codeforces.com/contest/1200/problem/F) RE7,然后发现,`#define int long long` 它爆栈了... --- 输出调试究竟应该用 cerr 还是 cout / printf 呢。 cout 可能忘删就 WA 了。 但 cerr 可能让你不会 WA 只会 TLE,然后盯着自己的代码看一年为什么常数那么大。 总之记得删调试信息... ------------ FFT中 $w_n^i=cos(\frac{2\pi}i)+sin(\frac{2\pi}i) i$,然而如果枚举的 $i$ 是区间长度的一半,就要相应地改成 $w_n^i=cos(\frac\pi i)+sin(\frac\pi i) i$。 ------------ 由于窝一开始看的杜教筛教程(事实上很多杜教筛教程)(事实上很多数论教程都)乱用字母,于是经常把 $g(1)S(n)=\sum\limits_{i=1}^n h(n)-\sum\limits_{d|n}g(d)S(\left\lfloor\frac n d\right\rfloor)$ 中的 $n$ 和题目中的 $n$ 搞混..要注意qwq ------------ 稠密图求全源最短路不要用 dijkstra... ~~Floyd是世界上最优秀的最短路算法,好写常数小,n^3过1000~~ ------------ Splay insert 之后一定要 Splay,不只是复杂度的问题,不Splay就没有上传siz。 ------------ ![](https://i.loli.net/2018/12/08/5c0b6919cc83a.png) $O(n^2(\frac{2\times10^5}{32}+n))$了解一下。 人要有梦想,memset不能有。(无意冒犯某杭二julao) ------------ noi.ac上sort的重载运算符都要const...一般只有pq要的,但为了保险以后记得用于排序的重载运算符都要const(其实按照工程标准,不修改的所有地方都应该用const..) ------------ P2515 [HAOI2010]软件安装 `有些课程必须在某些课程之前学习` 与 `软件i只有在安装了软件j(包括软件j的直接或间接依赖)的情况下才能正确工作` 之区别... ------------ P2149 [SDOI2009]Elaxia的路线 搜索最短路dp时没有加vis爆炸... 虽然最短路搜不出环,但可能从不同的分支重复搜到某个点。 (所以说还是尽量判个vis,即使没用也没关系嘛...) ------------ P1896 [SCOI2005]互不侵犯 老年oi选手,把&当|用,脑抽了以为是把1“并”起来..... ------------ 使用`std::priority_queue`要确保无论何时pq内元素进行比较结果相同,即,不能比较dis[x]和dis[y]但在x、y已进入pq时修改dis[x]或dis[y]。 ------------ 今天写了下模板才发现自己之前一直写的假的堆优化dijkstra...要确保每个节点只用于松弛一次。 ------------ ![](https://i.loli.net/2018/11/08/5be3bf188f379.png) ------------ 最近快速幂连着两题把&打成&&...需要注意. ------------ [TC12373开车车](https://bbs.codeaha.com/problem-12373.html) 遇到长相奇怪的最短路不要脑抽用dfs求... ------------ **bool** operator<() ------------ CF1063B Labyrinth 我太菜了,向右走-向左走=横坐标之差都没看出来... 多个限制条件记得看各个条件之间的关系。 ------------ P3916 图的遍历 之前一直用的鬼畜至极的缩点方式..然后今天愉快地WA了一面..貌似正确的缩点姿势是把读入存进来,跑完tarjan之后清空原图,不在同一个scc的连边。 ------------ 膜你赛埃氏筛写错了...................................... 要枚举到 $n$ 而不是 $\sqrt{n}$ ------------ 有时函数不带返回值-Wall都不会警告... ------------ P1903 [国家集训队]数颜色 / 维护队列 ~~因为是第一次写带修莫队~~ 修改时间的函数是进行/回退某次修改,而不是修改至某时间,所以 ```cpp while (now>q[i].t) { modify(i,now--); } ``` 是now--而不是--now ------------ P4014 分配问题 看下面P3381那条...该打!(~~考虑以后树的dfs都把vis写着~~) ------------ P3386 【模板】二分图匹配 Dinic记得 for (i=head[u];i**&&minn-out**;i=nxt[i]) ------------ P3796 【模板】AC自动机(加强版) 多组数据记得cnt=0... ------------ P4305 [JLOI2011]不重复数字 无需排序时用unordered_set比set快得多,几乎和手写哈希一样快。 ------------ P3381 【模板】最小费用最大流 dinic在求最大流的时候因为分层不会重复访问,求最小费用最大流时则可能重复访问,要用vis标记避免重复访问 总结:平时树之类的写多了都不习惯写vis了...除了树或者像求最大流的dinic一样有特殊限制的图,以及像P2279之类需要重复访问的问题,一般的dfs要记得用vis避免重复访问 ------------ P2740 [USACO4.2]草地排水Drainage Ditches [最大流] 虽然感觉是因为初学网络流没理解透以后应该不会再错.. 过了模板题之后直接复制过来然后84,以为是重边的原因,想了半天都觉得EK应该是可以过重边的,后来才发现反向边边权应该为0而不是-w...互为相反数的是流而不是边权。 ------------ 牛客网NOIP赛前集训营-提高组(第一场) A 中位数 直接check i==x不满足二分性时不妨试试check所有的i>=x,必然满足二分性。 ------------ P1629 邮递员送信 堆优化dijkstra是 $O(mlogn)$ 的..稠密图不要用.. ------------ P1032 字串变换 首先恭喜自己终于填上了远古搜索巨坑!(to be finished: css,bxsd) 然后是string::size()的返回值是unsigned,可能会减爆.而且int遇上unsigned会变成unsigned,就是说所有size()都得套上一个int().当然移项变成加号就没有这个问题了。 ------------ P1631 序列合并 IDE内根据编译错误信息就立刻修正了,还是注意一下priority_queue如果重载<参数要const,即类似于: ``` struct T { //XXXXXXXX bool operator<(const T XXX) const { return XXXXXXXXX; } }; priority_queue<T> q; ``` ------------ P3369 【模板】普通平衡树 前一天晚上对着题解愣是把Splay敲出来了,然后对照一看,说我是复制粘贴Ctrl+F的我都没话说... 于是今天试着自己写,Del愉快地忘判cnt>1了....... ------------ 安师大附中膜你赛Day1T2 简单(~~个鬼~~)数据结构 这题我用了很奇妙的算法,在线段树内二分查找,导致即使查询区间覆盖当前区间也可能访问儿子,然后愉快地忘记down了。 以后要记得线段树内只要访问儿子就得down ~~然而这题就算记得加down也炸了~~ ------------ CF1016E Rest In The Shades 当你在CFTLE时,不要慌张,把所有没有必要的long long改成int,long double改成double,endl全部改成\n,快读快输都用上,输出为浮点数时不要忘了还有printf.TM就可以卡常卡过去了 ------------ T39158 大逃亡 神仙错误.......(幸好我交之前用luogu IDE跑了一遍而且代码类型没有选C++11)y0,y1之类的变量会与math.h库冲突,参见[博客](https://blog.csdn.net/changjiale110/article/details/78043531)以及[这个](https://msdn.microsoft.com/en-us/library/h7zkk1bz.aspx) ------------ P1122 最大子树和 鱼唇的我看了讨论才发现前向星数组双向边没有开两倍..这才明白之前dewdalao的一堆<<1..~~反正是刚刚开始用前向星~~错了就是错了! ------------ 这次并不是错题QwQ 模拟赛的时候被老师提醒了,NOIPfreopen不加cstdio会爆零的... 用了大半年fstream刚改freopen的我被吓到了QAQ ------------ CF 1009C Annoying Present 我果然还是太菜了... 不写precision默认只输出6位有效数字.. 所以即使没让你保留如果精度要求高也要precision %%%![](http://r.photo.store.qq.com/psb?/V11ZEfn30LVDI9/NIVjzSzMSj57GSOfIQdBAqksTYchrb5GUMFNFFEXpZo!/r/dDIBAAAAAAAA) 至截图时他还在hack ~~身为LGM每场div2坚持hack100+~~ ------------ P2279 [HNOI2003]消防局的设立 [DFS][贪心] 花式(4种不同的方法)螺旋(WA+RE+TLE)20分 dfs要延伸两格,所以vis==true也不能return。 也是告诉我们如果多种方法都过不了,要注意每次都没有修改的部分。 ------------ P2512 [HAOI2008]糖果传递 这个不算错题,但在最优解中找到了个好东西:nth_element 用法: ``` #include <algorithm> template <class RandomAccessIterator> void nth_element (RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last); template <class RandomAccessIterator, class Compare> void nth_element (RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last, Compare comp); ``` 即:void nth_element(指向开始位置的迭代器l,指向第n大的位置的迭代器nth,指向结束位置的迭代器r) 效果:将[l,r)重新排列,使得*nth为[l,r)中第n大的元素,并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的。 ------------ P3932 浮游大陆的68号岛 [线段树] [前缀和] 取模后大小关系会变,因此可能减法时会出现原本不会出现的负数,要注意加上模数 ------------ P1937 [USACO10MAR]仓配置Barn Allocation [线段树] down忘记下传标记了...服了自己 ------------ P1140 相似基因 [dp] dp时取最大值如果可能出现负数要初始化为-0x7fffffff ------------ T34477 贝茜的飞行路线 [模拟] 读入的过程中不要break..... ------------ Codeforces Round #493 (Div. 2) for语句单句没加分号导致后面的语句被套进去... ------------ Educational Codeforces Round 46 (Rated for Div. 2) >substring必须是原字符串中连续的字符串,而subsequence可以不是。 ------------ Educational Codeforces Round 45 (Rated for Div. 2) 开long long不只是声明变量!! 少了“1ll*”的我怕不是身为pupil要继续掉rating 这一是告诉我们不仅储存结果的变量要声明为ll,过程中也不能运算溢出;二是告诉我们直接Ctrl+F无脑替换ll有时是有用的,比如这次a数组中的值不可能爆int,但如果我开了ll就不用“1ll*”了 ------------ Avito Code Challenge 2018 打CF千万不要用hash!!! 就算用hash也一定要随机取模!!! 血的教训!!! (每次取模的锅我都会咆哮吗..) ------------ P2323 [HNOI2006]公路修建问题 [最小生成树][二分答案] 这题要二分答案然后输出方案。 日常二分玄学,答案是l+1。 然后没有check(l+1)就WA了。 ------------ P2024 食物链 [带权并查集] 用到取模的题一定每个地方都要取模!!! ------------ P1821 [USACO07FEB]银牛派对Silver Cow Party && P1828 香甜的黄油 Sweet Butter [SPFA] 两道模板题.. 虽然都是很快就发现了问题,但因为连错两次,所以写在这吧。 用-1标识为不连通时d[起点]一定要初始化为0!!! 另外一开始忘记判断inq直接入队,虽然A了,但不知道哪题忘了inq就会被卡 ------------ P2023 [AHOI2009]维护序列 [线段树] 18.3.24 几年(雾)没写线段树了.. 各种炸. 首先是down,直接上代码,不记得一开始写成啥了: ``` ll.sum=(ll.sum*cc.ti+cc.ad*(ll.right-ll.left))%p; rr.sum=(rr.sum*cc.ti+cc.ad*(rr.right-rr.left))%p; ll.ti=(ll.ti*cc.ti)%p; ll.ad=(ll.ad*cc.ti+cc.ad)%p; rr.ti=(rr.ti*cc.ti)%p; rr.ad=(rr.ad*cc.ti+cc.ad)%p; cc.ad=0; cc.ti=1; ``` 然后是add,cc.sum=(cc.sum+delta*(cc.right-cc.left))%p;直接写成cc.sum=(cc.sum+delta*(r-l))%p;... ------------ P3390 【模板】矩阵快速幂 18.2.18 很难受,非常难受,一个星期没怎么做题了,上洛谷发现自己橙名,随手做了一道,结果,因为太久没打,写了个memset(a,sizeof(a),0); 凌乱至极 另外还有就是按位快速幂的时候k最大会爆int,一开始1<<kkk,应该1ll<<kkk 总结: memset(地址,数值,内存块大小); 按位计算时如果1<<k会爆int就要1ll<<k P.S.感觉不重载赋值运算符会浅复制..然而A了..赶寒假作业中,有时间再研究研究 ------------ P1967 货车运输 [最大生成树,LCA] 18.2.11 主要是两个大的错误吧 一个是当图不连通时有多个生成树,但只dfs了一次 另一个是LCA的dp循环套反了 总结: 用生成树+LCA求路径问题时,如果有可能不连通,一定要对每个未访问节点dfs LCA的dp:f[i][j]=f[f[i][j-1]][j-1]; 循环一定要把j写在i外面 ------------ P1456 Monkey King [左偏树] 18.2.10 没啥好说的了..就是把总结那句写错了,还检查了半天没检查出来orz 总结: 可并堆(左偏树)合并是s[x].r=merge(s[x].r,y);不是s[x].r=merge(s[x].l,y); ------------ P2380 狗哥采矿 [dp] 18.2.9 错解: for (i=n;i>=1;--i) for (j=m;j>=1;--j) cout<<f[1][1]+max(prea[1][1],preb[1][1])<<endl; 正解: for (i=n;i>=0;--i) for (j=m;j>=0;--j) cout<<f[0][0]<<endl; 像错解那样就默认了左上第一个是单独运的,然而并不一定 总结: dp一般都是直接输出某状态,如果不是一定要三思,仔细想清楚状态表示的意义。有时虽然有的状态的实际意义看起来很奇怪,但算出来的答案是正确的。 ------------ P3377 【模板】左偏树(可并堆) 18.2.9 玄学..至今不知道哪错了..指针WA,多个数组MLE,结构体AC 应该不是写法的问题,而是越写越熟练,之前修改找不到错的地方,最后全部重写就过了吧 以后自己变成大牛了再来仔细看看到底哪里错了 https://www.luogu.org/recordnew/show/5683349 https://www.luogu.org/recordnew/show/5689685 https://www.luogu.org/recordnew/show/5691652 ------------ P3378 【模板】堆 18.2.8 一开始删除的时候没有判断正在往下降的节点是否会越界,最后一次WA是判断反了(i*2>=len) 总结: 堆的删除操作一定要i*2<=len(i为正在下降的节点编号)