求助,请找出下面代码的所有UB
  • 板块学术版
  • 楼主歌吟入梦
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/5/10 20:43
  • 上次更新2023/11/7 02:41:33
查看原帖
求助,请找出下面代码的所有UB
54153
歌吟入梦楼主2020/5/10 20:43

这代码里面应该有Undefined Behavior,各位帮我找一下

#include<cstdio>
#include<cstring>
using namespace std;
template<class T>inline void read(T&a){
	char c=getchar();int f=1;a=0;
	while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}
	while(c<='9'&&c>='0') a=(a<<1)+(a<<3)+c-48,c=getchar();
	a*=f;
}
template<class T>void write(T a){
	if(a<0) putchar('-'),a=-a;
	if(a>9) write(a/10);
	putchar(a%10+48);
}
const int o=1e5+10;
int T,n,l,r,rt[o],cnt,dis[o],val[o],id[o],ls[o],rs[o],nod[o],ans;
inline int nwnd(int VAL,int ID){dis[++cnt]=ls[cnt]=rs[cnt]=0;val[cnt]=VAL;id[cnt]=ID;nod[ID]=cnt;return cnt;}
int merge(int x,int y){
	if(!x||!y) return x+y;
	if(val[x]>val[y]) x^=y,y^=x,x^=y;
	rs[x]=merge(rs[x],y);
	if(dis[rs[x]]>dis[ls[x]]) rs[x]^=ls[x],ls[x]^=rs[x],rs[x]^=ls[x];
	dis[x]=(rs[x]?(dis[rs[x]]+1):0);
	return x;
}
int main(){
	read(T);while(T--){
		read(n);cnt=0;memset(rt,0,sizeof rt);ans=1;
		for(int i=1;i<=n;++i) read(l),read(r),rt[l]=merge(rt[l],nwnd(r,i));
		for(int i=1;i<=n;++i){
			while(rt[i]&&val[rt[i]]<i) rt[i]=merge(ls[rt[i]],rs[rt[i]]);
			if(!rt[i]){ans=0;break;}
			int VAL=val[rt[i]],ID=id[rt[i]];rt[i]=merge(ls[rt[i]],rs[rt[i]]);
			rt[VAL+1]=merge(rt[VAL+1],rt[i]);
			if(ID!=i) ans*=-1,id[nod[i]]=ID,nod[ID]=nod[i];
		}
		putchar((ans==-1)?('F'):((ans==0)?'D':'Y'));putchar('\n');
	}
	return 0;
}

2020/5/10 20:43
加载中...