大佬求助
  • 板块P1621 集合
  • 楼主wsadjkl0
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/6/19 10:39
  • 上次更新2023/11/4 21:44:04
查看原帖
大佬求助
218974
wsadjkl0楼主2021/6/19 10:39

80分两个tle,如何优化┭┮﹏┭┮

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;

int bcj[N], size[N], ans, kuku[N] = {1, 1}, prime[N], p;
//线筛优化
void zhishu(int n){
for(int i = 2; i <= n; i++){
if(kuku[i] == 0) {prime[p] = i; p++;}
for(int j = 0; j < p && prime[j]*i <= n; j++) kuku[prime[j]*i] = 1;
}
}
int isprime(int x){
	if(kuku[x]) return 0;
	return 1;
}

/*int isprime(int x){
	for(int i = 2; i*i <= x; i++)
		if(x%i == 0) return 0;
	return 1;
}*/
int gcd(int a, int b){
	if(b == 0) return a;
	return gcd(b, a%b);
}
//并查集优化
void init(int x, int y){
	for(int i = x; i <= y; i++ ){
		bcj[i] = i; 
        size[i] = 1;
    }
}
int find(int x){
	if(x == bcj[x]) return x;
	return bcj[x] = find(bcj[x]);
}

void join(int aa, int bb){
	int a = find(aa), b = find(bb);
	if(a != b) {
    if(size[a] < size[b]) swap(a, b);
    bcj[b] = a;
    size[a] += size[b];
    }
}

int main(){
	int a, b, q; cin >> a >> b >> q;
	int n = b-a+1;
	ans = n;
	init(a, b);
    zhishu(b);
    //思路是一一枚举每两个数的情况,不知道咋优化了
	for(int i = a; i <= b; i++){
		for(int j = a; j <= b; j++){
            if(find(i) == find(j)) continue;
			int tmp = gcd(i, j);
			if(tmp >= q && isprime(tmp)) {
				join(i, j);
				ans--;
                break;
                //cout << i << ' ' << j << ' ' << ans << endl;
			}
		}
	}
	
	cout << ans;
	return 0;
}
2021/6/19 10:39
加载中...