96pts MLE on#6 求助
查看原帖
96pts MLE on#6 求助
826774
Little_Fox_Fairy楼主2024/7/16 21:53

结构体开大了 MLE ,开小了 WA (or TLE)。

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long 
using namespace std;
const int N=1e5+10;
char eof_flag;inline char read(int *s){if(eof_flag)return 0;int k=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9')){if(c==EOF){eof_flag=1;return 0;}c=getchar();}f=(c=='-')?-1:1;k=(c=='-')?0:(c^48);c=getchar();while(c>='0'&&c<='9')k=(k<<1)+(k<<3)+(c^48),c=getchar();if(c==EOF)eof_flag=1;(*s)=f>0?k:-k;return 1;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');return;}
struct hjt_tree
{
	struct node
	{
		int l,r,val;
	}t[N<<5];
	int n,m,root[N],tim,e[N];
	inline int build(int l,int r)
	{
		int u=++tim;
		if (l==r)
		{
			t[u].val=e[l];
			return u;
		}
		int mid=l+r>>1;
		t[u].l=build(l,mid);
		t[u].r=build(mid+1,r);
		return u;
	}
	inline int update(int u,int l,int r,int x,int val)
	{
		int rt=++tim;
		t[rt].l=t[u].l,t[rt].r=t[u].r;
		if (l==r)
		{
			t[rt].val=val;
			return rt;
		}
		int mid=l+r>>1;
		if (x<=mid) t[rt].l=update(t[u].l,l,mid,x,val);
		else t[rt].r=update(t[u].r,mid+1,r,x,val);
		return rt;
	}
	inline int query(int u,int l,int r,int x)
	{
		if (l==r) return t[u].val;
		int mid=l+r>>1;
		if (x<=mid) return query(t[u].l,l,mid,x);
		else return query(t[u].r,mid+1,r,x);
	}
}tr,siz;

int n,m;
inline int find(int u,int i)
{
	while (tr.query(tr.root[i],1,n,u)!=u) u=tr.query(tr.root[i],1,n,u);
	return u;
}
inline void merge(int x,int y,int i)
{
	int u=find(x,i);
	int v=find(y,i);
	if (u==v) return ;
	int size1=siz.query(siz.root[i],1,n,u),size2=siz.query(siz.root[i],1,n,v);
	if (size1<=size2)
	{
		tr.root[i]=tr.update(tr.root[i],1,n,u,v);
		siz.root[i]=siz.update(siz.root[i],1,n,v,size1+size2);
	}
	else
	{
		tr.root[i]=tr.update(tr.root[i],1,n,v,u);
		siz.root[i]=siz.update(siz.root[i],1,n,u,size1+size2);
	}
	return ;
}
signed main()
{
	read(&n),read(&m);
	for (register int i=1;i<=n;i++) tr.e[i]=i;
	tr.root[0]=tr.build(1,n);
	for (register int i=1;i<=n;i++) siz.e[i]=i;
	siz.root[0]=siz.build(1,n);
	for (register int i=1;i<=m;i++)
	{
		int op,x,y;
		read(&op);
		tr.root[i]=tr.root[i-1];
		siz.root[i]=siz.root[i-1];
		if (op==1)
		{
			read(&x),read(&y);
			merge(x,y,i);
		}
		if (op==2)
		{
			read(&x);
			tr.root[i]=tr.root[x];
			siz.root[i]=siz.root[x];
		}
		if (op==3)
		{
			read(&x),read(&y);
			if (find(x,i)==find(y,i)) puts("1");
			else puts("0");
		}
	}
	return 0;
}

也许是哪里写挂了吧?

2024/7/16 21:53
加载中...