关于一个奇怪的 UB
查看原帖
关于一个奇怪的 UB
451328
lnwhl楼主2023/2/6 10:53
#include <bits/stdc++.h>
#define il inline
#define mid (l+r>>1)
using namespace std;
const int N=2e5+5;
int n,m,t;
struct tree
{
	int rt[N],st[N],tot=0;
	struct sgt{int ls,rs,val;}seg[N<<4];
	il void build(int &k,int l,int r)
	{
		k=++tot;
		if(l==r){seg[k].val=st[l];return;}
		build(seg[k].ls,l,mid);build(seg[k].rs,mid+1,r);
	}
	il void clone(int &k,int kf,int l,int r,int x,int y)
	{
		k=++tot;seg[k].ls=seg[kf].ls;seg[k].rs=seg[kf].rs;
		if(l==r){seg[k].val=y;return;}
		if(x<=mid)clone(seg[k].ls,seg[kf].ls,l,mid,x,y);
		else clone(seg[k].rs,seg[kf].rs,mid+1,r,x,y);
	}
	il int query(int rt,int l,int r,int x)
	{
		if(l==r)return seg[rt].val;
		if(x<=mid)query(seg[rt].ls,l,mid,x);
		else query(seg[rt].rs,mid+1,r,x);
	}
}bin,siz;
il int find(int x)
{
	while(bin.query(bin.rt[t],1,n,x)!=x)x=bin.query(bin.rt[t],1,n,x);
	return x; 
}
il void merge(int x,int y)
{
	int a=find(x),b=find(y);
	if(a==b)return;
	int sizx=siz.query(siz.rt[t],1,n,a);
	int sizy=siz.query(siz.rt[t],1,n,b);
	if(sizx<=sizy)
	{
		bin.clone(bin.rt[t],bin.rt[t],1,n,a,b);
		siz.clone(siz.rt[t],siz.rt[t],1,n,b,sizx+sizy);
	}
	else
	{
		bin.clone(bin.rt[t],bin.rt[t],1,n,b,a);
		siz.clone(siz.rt[t],siz.rt[t],1,n,a,sizx+sizy);
	}
}
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;++i)bin.st[i]=i;
	bin.build(bin.rt[0],1,n);
	for(int i=1;i<=n;++i)siz.st[i]=1;
	siz.build(siz.rt[0],1,n);
	for(t=1;t<=m;++t)
	{
		int op;cin>>op;
		bin.rt[t]=bin.rt[t-1];
		siz.rt[t]=siz.rt[t-1];
		if(op==1)
		{
			int x,y;cin>>x>>y;
			merge(x,y);
		}
		else if(op==2)
		{
			int x;cin>>x;
			bin.rt[t]=bin.rt[x];
			siz.rt[t]=siz.rt[x];
		}
		else
		{
			int x,y;cin>>x>>y;
			if(find(x)==find(y))puts("1");
			else puts("0");
		}
	}
	return 0;
}

这份代码,不开 O2 AC开 O2 全部 MLE

请问是什么问题???求助大佬。

(本代码在其他 OJ 也有同样的问题)

2023/2/6 10:53
加载中...