RE求助,玄关

P3402 可持久化并查集

@[sbno333](/user/416975) `int merge` 没有 return
by sunkuangzheng @ 2024-03-05 07:51:48


这么卷
by henrytb @ 2024-03-05 10:26:24


@[sunkuangzheng](/user/679936) 一关,已经拿到了分数。
by sbno333 @ 2024-03-05 18:09:39


@[sunkuangzheng](/user/679936) 不 RE 了,但是怎么改都是TLE。(你可以看到我的提交,68分) ```cpp #include<bits/stdc++.h> using namespace std; int n; struct st{ int lson,rson; int l,r; int ans; }; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } void write(int x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return; } struct node{ st f[5000009]; //map<int,st> f; int root[1000009]; int bb; int inn; inline void pushup(int t){ if(f[t].l^f[t].r){ f[t].ans=f[f[t].lson].ans+f[f[t].rson].ans; } } inline int build(int l,int r){ if(!(l^r)){ //f[++inn].ans=read(); f[++inn].ans=l; f[inn].l=l,f[inn].r=r; return inn; } int z; z=++inn; f[inn].l=l,f[inn].r=r; int mid; mid=l+r; mid>>=1; f[z].lson=build(l,mid); f[z].rson=build(mid+1,r); //pushup(z); return z; } inline int answer(int t,int x){ if(!(f[t].l^1)&!(f[t].r^n)){ root[++bb]=inn+1; } if(f[t].l^f[t].r){ f[++inn].l=f[t].l; f[inn].r=f[t].r; f[inn].ans=f[t].ans; return f[t].ans; } int mid; mid=f[t].l+f[t].r; mid>>=1; f[++inn].l=f[t].l; f[inn].r=f[t].r; if(x<=mid){ f[inn].rson=f[t].rson; f[inn].lson=inn+1; return answer(f[t].lson,x); }else{ f[inn].lson=f[t].lson; f[inn].rson=inn+1; return answer(f[t].rson,x); } //pushup(z); } inline int answ(int t,int x){ if(!(f[t].l^f[t].r)){ return f[t].ans; } int mid; mid=f[t].l+f[t].r; mid>>=1; if(x<=mid){ return answ(f[t].lson,x); }else{ return answ(f[t].rson,x); } } inline void change(int t,int x,int y){ if(!(f[t].l^1)&!(f[t].r^n)){ root[++bb]=inn+1; } if(!(f[t].l^f[t].r)){ f[++inn].l=f[t].l; f[inn].r=f[t].r; f[inn].ans=y; return; } int mid; mid=f[t].l+f[t].r; mid>>=1; f[++inn].l=f[t].l; f[inn].r=f[t].r; if(x<=mid){ f[inn].rson=f[t].rson; f[inn].lson=inn+1; change(f[t].lson,x,y); }else{ f[inn].lson=f[t].lson; f[inn].rson=inn+1; change(f[t].rson,x,y); } } int getfa(int u,int x){ int s; s=answ(root[u],x); while(x^s){ x=s; s=answ(root[u],x); } return x; } void merge(int u,int x,int y){ int s1,s2; s1=s2=0; int s; s=answ(root[u],x); while(x^s){ x=s; s=answ(root[u],x); s1++; } s=answ(root[u],y); while(y^s){ y=s; s=answ(root[u],y); s2++; } if(s1>s2){ swap(x,y); } change(root[u],x,y); } }a; int tim[1000009]; int inn; int main(){ //freopen("sd.in","r",stdin); //freopen("sd.out","w",stdout); std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int q; //cin>>n>>q; //cin>>n>>q; n=read(),q=read(); a.root[0]=a.build(1,n); int u; u=0; for(int i=1;i<=q;i++){ int op; //cin>>op; op=read(); if(op==1){ int x,y; x=read(),y=read(); a.merge(tim[i-1],x,y); tim[i]=++inn; }else if(op==2){ int x; x=read(); tim[i]=tim[x]; }else{ int x,y; x=read(),y=read(); write((a.getfa(tim[i-1],x)==a.getfa(tim[i-1],y))); putchar('\n'); tim[i]=tim[i-1]; } } return 0; } ```
by sbno333 @ 2024-03-05 22:24:27


|