\(1.\) 开什么类型,输出时也应该输出该类型,或者强制类型转化,不然本地可能没有什么问题,但交上去就会出问题,详见1和2两处代码仅仅改了输出的类型,结果却大不相同。
\(2.\) 要看清数据范围,有时候会爆 long long,可以选择用 __int128 (这是个好东西),或者自然溢出(如果模数特殊的话)。
\(3.\) 网络流 tot=1。
\(4.\) ISAP rest 为 0 时直接 return 而不是 break。
\(5.\) size 尽量用 sz 代替,可能交上去会 CE ,为了预防某些单词是关键字,可以将这些单词的元音全部去掉。
\(6.\) << 和 >> 的优先级很低,多数情况下要加括号。
\(7.\) 网络流 dinic 模板之前一直打错了,直到做到这题 P2598 [ZJOI2009]狼和羊的故事 ,一直以为是卡 dinic ,专门去学了 ISAP ,还觉得 dinic 不行了,原来是自己之前的网络流都打假了,背模板果然还是不行,呜呜。
int dinic(int x,int flow){
if(x==t) return flow;
int rest=flow;
for(int i=now[x];i;i=Next[i]){
now[x]=i;
int y=to[i];if(d[y]!=d[x]+1||!edge[i]) continue;
int k=dinic(y,min(edge[i],rest));
if(!k) d[y]=0; //这里是 if(!k) 不是 if(k) !!!!!!
edge[i]-=k,edge[i^1]+=k,rest-=k;
if(!rest) return flow;
}
return flow-rest;
}
\(8.\) 线段树 lzay 数组下推的时候,是加等于,不是等于(惨痛的教训,就因为这里打错了,少了 70 分,排名从 38 掉到 99 ,详见这场)。
void PushDown(int u){
if(lazy[u]){
lazy[ls]+=lazy[u],lazy[rs]+=lazy[u];
minn[ls]-=lazy[u],minn[rs]-=lazy[u];
lazy[u]=0;
}
}
\(8.\) 有些时候记得要先用变量将那些值可能会变的实现存下来,不然可能就会像我一样调了4个多小时的splay,傻逼。
\(9.\) 平衡树 splay ,插入哨兵时要看清数据范围,要比最大值要大,最小值要小,不然旋转时会死循环。
\(10.\) 程序有时候死掉,可能是因为模了 0 ,例如下面这位受害者,我不说是谁,写的一个 add
void add(int &a,int b){
a+=b;a%=b; //应该是 a%=mod;
}
先不说写错了,如果 b 为 0 ,程序就会死掉。