90pts玄关求调
查看原帖
90pts玄关求调
1220203
Alemirai楼主2025/7/26 17:15
#include <iostream>
#define int long long
using namespace std;
const int N=1e5+7,mod=1e9+7;
int fa[N*25],n,m,cnt,idx,id[N][25],rev[N*25];
int qpow(int a,int b) {
	int res=1;
	while(b) {
		if(b&1)res=res%mod*a%mod;
		a=a%mod*a%mod;
		b>>=1;
	}
	return res;
}
int find(int x) {
	if(fa[x]==x)return x;
	else return fa[x]=find(fa[x]);
}
signed main() {
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		for(int j=0;j<=20;j++) {
			if(i+(1<<j)-1>n)break;
			id[i][j]=++idx;
			rev[idx]=i;
			fa[idx]=idx;
		}
	}
	for(int i=1;i<=m;i++) {
		int l1,l2,r1,r2;
		cin>>l1>>r1>>l2>>r2;
		int len=r1-l1+1;
		int w=__lg(len);
		int x1=id[l1][w],x2=id[r1-(1<<w)+1][w],y1=id[l2][w],y2=id[r2-(1<<w)+1][w];
		x1=find(x1),x2=find(x2),y1=find(y1),y2=find(y2);
		if(x1!=y1)fa[x1]=y1;
		if(x2!=y2)fa[x2]=y2;
	}
	for(int k=20;k>=1;k--) {
		for(int i=1;i<=n;i++) {
			if(i+(1<<k)-1>n)break;
			int x=find(id[i][k]);
			x=rev[x];
			int x1=id[i][k-1],x2=id[i+(1<<(k-1))][k-1],y1=id[x][k-1],y2=id[x+(1<<(k-1))][k-1];
			x1=find(x1),x2=find(x2),y1=find(y1),y2=find(y2);
			if(x1!=y1)fa[x1]=y1;
			if(x2!=y2)fa[x2]=y2;
		}
	}
	for(int i=1;i<=n;i++) {
		if(find(id[i][0])==id[i][0])cnt++;
	}
	cout<<9*qpow(10,cnt-1)%mod;
}

详情见此处

2025/7/26 17:15
加载中...