【杂项】我的一些代码错误(调哭)

发布时间 2023-05-25 22:26:16作者: jiangchenyangsong

\(1.\) 开什么类型,输出时也应该输出该类型,或者强制类型转化,不然本地可能没有什么问题,但交上去就会出问题,详见12两处代码仅仅改了输出的类型,结果却大不相同。

\(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 ,程序就会死掉。