社区讨论

样例可过但是满江红

P3295[SCOI2016] 萌萌哒参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@ly5jqfnn
此快照首次捕获于
2024/07/03 15:58
2 年前
此快照最后确认于
2024/07/03 16:24
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m;
int ln;
int fa[N][20];
int find(int x,int y){
	if(fa[x][y]==x)return x;
	fa[x][y]=find(fa[x][y],y);
	return fa[x][y];
}
bool vis[N];
signed main(){
	cin>>n>>m;
	ln=(int)log(n);
	for(int i=1;i<=n;i++){
		for(int j=0;j<=ln;j++){
			fa[i][j]=i;
		}
	} 
	while(m--){
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		int d=r1-l1+1;
		for(int i=ln;i>=0;i--){
			if((1<<i)<=d){
				if(find(l1,i)!=find(l2,i)){
					fa[find(l1,i)][i]=find(l2,i);
				}
				l1+=(1<<i);l2+=(1<<i);
				d=d-(1<<i);
			}
		}
	}
	int mid,r;
	for(int j=ln;j>=1;j--){
		for(int i=1;i+(1<<j)-1<=n;i++){
			mid=i+(1<<(j-1)),r=1+(1<<j)-1;//第一个和第二个终点
			if(find(i,j)!=i){
				fa[find(i,j-1)][j-1]=find(find(i,j),j-1);
				fa[find(mid,j-1)][j-1]=find(find(i,j)+(1<<(j-1)),j-1);
			} 
		}
	}
	int ans=0,ans2=9;
	for(int i=1;i<=n;i++){
		//cout<<fa[i][0]<<' ';
		if(vis[fa[i][0]]==0){
			vis[fa[i][0]]=1;
			ans++;
		}
	}
	for(int i=1;i<ans;i++)ans2=(ans2*10)%1000000007;
	cout<<ans2;
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...