防错笔记

枫林晚

2018-03-10 19:08:32

Personal

# 本文章记录所错、易错细节要点。 1.printf("%lld",ans); printf("%d",ans); **long long -> %lld** d -> %d (poj1456 Supermarket) 2.注意数组下标开始地址。 **string:0-strlen-1** (kmp manancher) 3.注意是否数组内减法(加法)会使越界(或小于0) 注意在取queue,q.pop()的时候,判断是否为空。 (poj 3784 Median) **4.注意特殊边界情况:** n=1;m=0;e<0等等 (poj3013 Big Chirstmas Tree) 5.对于多种数据题型: (1)注意清空之前的数据。 memset(bian,0,sizeof (struct node)*N) (poj系列) (2)poj做题,注意是一组数据还是多组 (poj1325 Machine Schedule) (3)多组数据中,特判加跳过时,注意输入完该组之后的数据,防止这些垃圾数据被后面一组数据吃掉,影响答案。(时间复杂度,判断是否合法)注意要保证t--(就算是特判跳过,也要带上t--)(zoj 1239Hanoi) **6.注意输出英文大小写以及标点!** Yes、YES、No、NO、!、。、?、空格.etc (poj 1135Domino Effect)(时间复杂度) 7.数位DP注意前导零的处理。 在0~99999(len-1个)时产生。 (luogu 2602数字计数) 8.prim算法中,从优先队列中取出来的一条边一定要**判断两端的点是否已被加入树中。** if(vis[a]&&vis[b]) bian++,continue; 典例:poj2728Desert King 9.st表中,f[i][j]表示:[i,i+2^j-1]最值。 并且,倍增时必须在**外层循环j**,由小块倍增到大块。 倍增: ```cpp for(int j=1;(1<<j)<=n;j++) for(int i=1;i+(1<<j)-1<=n;i++) { st[i][j]=min(st[i][j-1],st[i+(1<<(j-1)][j-1]; } ``` 查询: ```cpp scanf("%d%d",&l,&r); int len=log2(r-l+1); ans=min(st[l][lrn],st[r+1-(1<<len)][len]); ``` 10.输入边的循环时,注意是:for(1,m,i++) 不是for(1,n,i++) 要**分清点数n和边数m**。 11.邻接表建无向图:**bian[2倍M]** 双向。 RE无数。(luogu3629 巡逻) 12.有查询更改操作的题中,先读入“q”,分情况操作,**不要一次性读完之后的具体操作**。以免用字符读入两位数爆零。 (寒假%你赛,luogu1383高级打字机) 13.memset时,检查是否全部清空。 (poj3694) 14.LCA时,dep[0]=-1; if(dep[x]<dep[y]) swap(x,y);(注意是小于) (poj3694)(poj3417) 15.有时候,一张map可能要从上到下循环一遍,再从左到右循环一遍, 即:先是for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) 再是for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) **一定注意的是:如果第二次将i定为列号,j定为行号时,找地图时一定要:a[j][i] ** 千万不能i,j写反了!!!!(在n!=m的时候就惨爆了)(AC100变爆零)(luogu2825 游戏)(ezoj 游戏)(3.24图论考试) 16.tarjan、边双联通分量时, 第三步染联通块时: for(int i=1;i<=n;i++) if(!c[x]) { dcc++; dfs(x); } (注意大括号位置扩全) 17.树状数组: 1.注意query、add中x的加减以及上下界不要弄混。 2.推荐x+=x&(-x),而不使用lowbit,不调用函数可以加速。 (HDOJ 5542) ```cpp int query(int x) { int tot=0; for(;x;x-=x&(-x)) tot+=tr[x]; return tot; } void add(int x,int c) { for(;x<=n;x+=x&(-x)) tr[x]+=c; } ``` 18.单调队列优化dp,注意单调队列中可以单调的部分是什么,**比较时一定要比较完整。** f[q[hd]]+kq[hd]+m>f[i]+kf[i]+m 一定不能丢掉一次项,常数项等。 (luogu 瑰丽华尔兹,股票交易) 19.注意,变量设为long long 的时候,**输入记得也用%lld。**~~(实在忘了long long就#define int long long)~~(poj2482 Stars in your window) 20.有许多棵树的时候,**千万不要忘了根节点编号。其中线段树一般根节点都是1**,不要和其他树混淆。 (树链剖分6h鏖战) 21.取模减法的时候,出现了负数,取模后还会是负数,所以要**(x+p)%p;保证正数** (P3197越狱) 22.线段树常规操作,**不要忘了mod**,不要忘了add时候,**sum+=add×(r-l+1)**