96pts too short on #5 抽象错误求调
查看原帖
96pts too short on #5 抽象错误求调
807774
_Wind_Leaves_ShaDow_楼主2024/7/16 23:14

rt,有没有人解释下这一般是怎么了。

#include <bits/stdc++.h>
//#define int long long
#define Rg register
#define Ri Rg int
#define Il inline
#define vec vector
#define pb push_back
#define fi first
#define se second
#define IT iterator

using namespace std;

typedef double db;
typedef pair<int,int> pii;
const int N=2e5,Inf=1e9;
const db eps=1e-8;

int n,Q;

struct Seg{
	int id=0,rt[N+5],ls[N*17+5],rs[N*17+5],a[N*17+5];
	Il int build(int l,int r,bool sid){
		int p=++id;
		if(l^r){
			int mid=(l+r)>>1;
			ls[p]=build(l,mid,sid);
			rs[p]=build(mid+1,r,sid);
		}else a[p]=(sid?1:l);
		return p;
	}
	Il int chg(int ps,int l,int r,int cp,int K){
		int p=++id;
		ls[p]=ls[cp];
		rs[p]=rs[cp];
		a[p]=K;
		if(l^r){
			int mid=(l+r)>>1;
			if(ps<=mid)ls[p]=chg(ps,l,mid,ls[p],K);
			else rs[p]=chg(ps,mid+1,r,rs[p],K);
		}
		return p;
	}
	Il int qry(int ps,int l,int r,int p){
		if(l==r)return a[p];
		int mid=(l+r)>>1;
		return (ps<=mid?qry(ps,l,mid,ls[p]):qry(ps,mid+1,r,rs[p]));
	}
}fa,de;

Il int find(int p,int t){
	for(Ri fp=fa.qry(p,1,n,fa.rt[t]);fp^p;fp=fa.qry(p,1,n,fa.rt[t]))p=fp;
	return p;
}

signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>Q;
	fa.rt[0]=fa.build(1,n,0);
	de.rt[0]=de.build(1,n,1);
	for(Ri t=1;t<=Q;t++){
		int op,a,b,x;
		cin>>op;
		if(op==2){
			cin>>x;
			fa.rt[t]=fa.rt[x];
			de.rt[t]=de.rt[x];
		}else{
			cin>>a>>b;
			if(op==1){
				int fx=find(a,t-1),fy=find(b,t-1),dx=de.qry(fx,1,n,de.rt[t-1]),dy=de.qry(fy,1,n,de.rt[t-1]);
				if(dx>dy){
					swap(fx,fy);
					swap(dx,dy);
				}
				fa.rt[t]=fa.chg(fx,1,n,fa.rt[t-1],fy);
				de.rt[t]=(dx==dy?de.chg(fy,1,n,de.rt[t-1],dy+1):de.rt[t-1]);
			}else{
				fa.rt[t]=fa.rt[t-1];
				de.rt[t]=de.rt[t-1];
				cout<<(find(a,t)==find(b,t))<<'\n';//不是输出了吗 qwq
			}
		}
	}
	return 0;
}
2024/7/16 23:14
加载中...