并查集10分
查看原帖
并查集10分
921450
Szy0720楼主2024/7/15 16:49
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,MOD=1e9+7;
int n,m,fa[N][50],cc[50],v[N],l1,l2,r1,r2,ans;
int find(int x,int y){
	if(fa[x][y]==x)return x;
	return fa[x][y]=find(fa[x][y],y); 
}
long long g(int x){
	if(x==0)return 1;
	if(x==1)return 10;
	long long y=g(x/2);
	y=(y*y)%MOD;
	if(n&1)y=(y*10)%MOD;
	return y;
}
int main(){
	cin>>n>>m;
	cc[0]=1;
	for(int i=1;i<=20;i++)cc[i]=cc[i-1]*2;
	for(int j=0;cc[j]<=n;j++){
		for(int i=1;i+cc[j]-1<=n;i++){
			fa[i][j]=i;
		}
	}
	for(int i=1;i<=m;i++){
		cin>>l1>>r1>>l2>>r2;
		int j=log(r1-l1+1)/log(2);
		int fl1=find(l1,j),fl2=find(l2,j);
		fa[fl1][j]=fl2;
		int fr1=find(r1-cc[j]+1,j),fr2=find(r2-cc[j]+1,j);
		fa[fr1][j]=fr2;
	}
	for(int j=log(n)/log(2);j>=1;j--){
		for(int i=1;i+cc[j]-1<=n;i++){
			int f=find(i,j);
			if(f==i)continue;
			int fa1=find(i,j-1),fa2=find(f,j-1);
			fa[fa1][j-1]=fa2;
			fa1=find(i+cc[j-1],j-1);
			fa2=find(f+cc[j-1],j-1);
			fa[fa1][j-1]=fa2;
		}
	}
	for(int i=1;i<=n;i++){
		int f=find(i,0);
		if(!v[f]){
			ans++;
			v[f]=1;
		}
	}
	cout<<(9*g(ans-1))%MOD;
	return 0;
}
2024/7/15 16:49
加载中...