敲响警钟
  • 板块灌水区
  • 楼主ReqCxmChtChr
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/8/12 21:29
  • 上次更新2023/10/27 15:42:09
查看原帖
敲响警钟
421451
ReqCxmChtChr楼主2022/8/12 21:29

像是主席树这种开大表的东西一定要放在全局,下面是

RE代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mid_A ((l+r)>>1)
#define Debug cerr<<"Passed line #"<<__LINE__<<" in function ["<<__FUNCTION__<<"].\n"
namespace mutable_dsu{
	class dsu{
		private:
		#define MAXN_B 100010
		int root[MAXN_B<<5];
		struct node{
			int lson,rson,fa,dep;
			node(int v){
				fa=v,dep=1;
				lson=rson=0;
			}
			node(node &b){
				lson=b.lson,rson=b.rson;
			}
			node(){
			}
		};
		node tree[MAXN_B<<5];
		int cnt=0,n;
		int build(int l,int r){
			cnt++;
			if(l==r){tree[cnt]=node(l);return cnt;}	
			tree[cnt].lson=build(l,mid_A);
			tree[cnt].rson=build(mid_A+1,r);
			return cnt;
		}
		int merge(int last,int l,int r,int pos,int val){
			cnt++;
			tree[cnt]=node(tree[last]);
			if(l==r){
				tree[cnt].fa=val;
				tree[cnt].dep=tree[last].dep;
				return cnt;
			}
			if(pos<=mid_A)tree[cnt].lson=merge(tree[last].lson,l,mid_A,pos,val);
			else tree[cnt].rson=merge(tree[last].rson,mid_A+1,r,pos,val);
		}
		void update(int now,int l,int r,int pos){
			if(l==r){tree[now].dep++;return;}
			if(pos<=mid_A)update(tree[now].lson,l,mid_A,pos);
			else update(tree[now].rson,mid_A+1,r,pos);
		}
		int query(int now,int l,int r,int pos){
			if(l==r)return now;
			if(pos<=mid_A)return query(tree[now].lson,l,mid_A,pos);
			else return query(tree[now].rson,mid_A+1,r,pos);
		}
		int find(int rt,int x){
			int now=query(rt,1,n,x);
			if(now==tree[now].fa){return now;}
			return find(rt,tree[now].fa);
		}
		public:
		void init(int n){
			this->n=n;
			root[0]=build(1,n);
		}
		void merge(int edition,int a,int b){
			int faa=find(root[edition],a),fab=find(root[edition],b);
			if(faa!=fab){
				if(tree[faa].dep>tree[fab].dep)swap(faa,fab);
				root[edition]=merge(root[edition-1],1,n,tree[faa].fa,tree[fab].fa);
				if(tree[faa].dep==tree[fab].dep)update(root[edition],1,n,tree[fab].fa);
			}
		}
		bool samepath(int edition,int a,int b){
			return find(root[edition],a)==find(root[edition],b);
		}
		void undo_to_edi(int now,int past){
			root[now]=root[past];
		}
		#undef MAXN_B
	};
} 
using namespace mutable_dsu;
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	srand(time(NULL));
	Debug;
	dsu tree;
}
2022/8/12 21:29
加载中...