TLE#2 并查集
  • 板块P1621 集合
  • 楼主count_year
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/4 12:51
  • 上次更新2025/1/4 17:00:35
查看原帖
TLE#2 并查集
705729
count_year楼主2025/1/4 12:51
#include<bits/stdc++.h>
using namespace std;
int f[100010];
int s[100010];
bool v[100010];
vector<int>g;
int n,m,k;
int cnt;
int next(int x){
	if(f[x]!=x){
	    f[x]=next(f[x]);
	}
	return f[x];
}
void make(int x,int y){
	int fx=next(x);
	int fy=next(y);
	if(fx!=fy){
		cnt--;
		if(s[fx]<s[fy]){
			f[fx]=fy;
			s[fy]+=s[fx];
		}else{
			f[fy]=fx;
			s[fx]+=s[fy];
		}
	}
}
void shai(){
	v[1]=1;
	for(int i=2;i<=m;i++){
		if(v[i]==0){
			g.push_back(i);
		}
		for(int j=0;i*g[j]<=m&&j<g.size();j++){
			v[g[j]*i]=1;
			if(i%g[j]==0){
				break;
			}
		}
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=0;i<=100000;i++){
		f[i]=i;
		s[i]=1;
	}
	shai();
	cnt=m-n+1;
	for(int i=0;i<g.size();i++){
		if(g[i]<k){
			continue;
		}
		for(int j=n/g[i];j*g[i]<=m;j++){
			if(j*g[i]<n){
				continue;
			}
			for(int h=j+1;h*g[i]<=m;h++){
				if(h*g[i]<n||j==h){
					continue;
				}
				make(j*g[i],h*g[i]);
			}
		}
	}
	printf("%d",cnt);
	return 0;
}

TLE #2

2025/1/4 12:51
加载中...