结构体开大了 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;
}
也许是哪里写挂了吧?