萌新并查集基础题70pts求助
查看原帖
萌新并查集基础题70pts求助
310773
PCCP楼主2023/7/25 17:23

RT,感觉是哪里写挂了,但是数据太水过了7个点,调了一下午了,求求谷内大佬帮忙调试 /bx

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
typedef pair<int,int> PII;
const int N=2e5+10;
const int M=4e6+10;
const long long MOD=1e9+7;
int n,m,cnt,num[N][20],r[N][20],fa[M],siz[M],mp[N];
long long ans=1;
PII dfo[M];
set<int> q;
inline int find(int x){
	if(fa[x]==x){
		return x;
	}
	return fa[x]=find(fa[x]);
}
inline void unify(int x,int y){
	int fx=find(x),fy=find(y);
	if(fx==fy){
		return;
	}
	if(siz[fx]<siz[fy]){
		swap(fx,fy);
	}
	siz[fx]+=siz[fy];
	fa[fy]=fx;
}
inline void prepare(){
	for(int i=1;i<=n;i++){
		for(int j=20;j>=0;j--){
			if(!num[i][j]){
				continue;
			}
			if(fa[num[i][j]]==num[i][j]){
				continue;
			}
			PII t=dfo[find(num[i][j])];
			if(j!=0){
				unify(num[t.first][t.second-1],num[i][j-1]);
				unify(num[r[t.first][t.second-1]+1][t.second-1],num[r[i][j-1]+1][j-1]);
			}
		}
	}
}
int main(){
	freopen("P3295_1.in","r",stdin);
	freopen("P3295.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
    	for(int j=0;i+(1<<j)-1<=n;j++){
    		num[i][j]=++cnt;
    		dfo[cnt]=PII(i,j);
    		r[i][j]=i+(1<<j)-1;
    		fa[cnt]=cnt;
    		if(j==0){
    			mp[i]=cnt;
			}
		}
	}
	int l1,l2,r1,r2;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		int len=r1-l1+1;
		while(len){
			int ws=32-__builtin_clz(len);
			unify(num[l1][ws-1],num[l2][ws-1]);
			l1=r[l1][ws-1]+1;
			l2=r[l2][ws-1]+1;
			len-=(1<<(ws-1));
		}
	}
	prepare();
	for(int i=1;i<=n;i++){
		int bef=q.size();
		q.insert(find(mp[i]));
		if(q.size()!=bef){
			if(i==1){
				ans*=9;
			}
			else{
				ans*=10;
				ans%=MOD;
			}
		}
	}
	printf("%lld\n",ans);
}
2023/7/25 17:23
加载中...