Preparación del Torneo Nacional de la Copa Blue Bridge DÍA2

Teoría de números:
1. Número primo

① 定义 法 : O (n)
n> = 2 && i <= n-1

②Método de propiedad: O (sqrt (n))
aparece en pares.
Si d puede dividir n, entonces n / d también puede dividir n.
D y n / d son un par,
entonces solo necesitamos enumerar al más pequeño.
Respuesta : d <= n / d,


d d <= n PS: No se recomienda este método de escritura. Si n está cerca del valor máximo de int, entonces d d puede tener riesgo de desbordamiento

d <= sqrt (n) PS: Este método de escritura no se recomienda porque la función se llama cada vez, lo cual es ineficiente.

2. Los
divisores son opuestos
a los números primos y la práctica es la misma que la de los números primos.


Colección consolidada : 836. Enlace del título de la colección consolidada

Es lo mismo que el kruscal que aprendí antes.

#include<iostream>

using namespace std;

const int N=100000+10;

int n,m;
int father[N];

int find(int x){
    
    
    return father[x]==x?x:father[x]=find(father[x]);
}

void my_union(int a, int b){
    
    
    int xx=find(a);
    int yy=find(b);
    if(xx!=yy){
    
    
        if(yy>xx){
    
    
            father[yy]=xx;
        }else{
    
    
            father[xx]=yy;
        }
    }
}

int main(){
    
    
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    
    
        father[i]=i;
    }
    
    while(m--){
    
    
        char s[2];
        int a,b;
        cin>>s>>a>>b;
        if(s[0]=='M'){
    
    
            my_union(a,b);
        }else{
    
    
            if(find(a)==find(b)){
    
    
                cout<<"Yes"<<endl;
            }else{
    
    
                cout<<"No"<<endl;
            }
        }
    }
        
    return 0;
}

La aplicación ampliada del conjunto de búsqueda de unión:
837. Vínculos al número de puntos en bloques conectados

Transformar sobre la base de fusionar y recopilar el código original.

#include<iostream>

using namespace std;

const int N=100000+10;

int n,m;
int father[N];
int se[N];

int find(int x){
    
    
    return father[x]==x?x:father[x]=find(father[x]);
}

void my_union(int a, int b){
    
    
    int xx=find(a);
    int yy=find(b);
    if(xx!=yy){
    
    
        if(yy>xx){
    
    
            se[xx]+=se[yy];
            father[yy]=xx;
        }else{
    
    
            se[yy]+=se[xx];
            father[xx]=yy;
        }
    }
}

int main(){
    
    
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    
    
        father[i]=i;
        se[i]=1;
    }
    
    while(m--){
    
    
        char s[5];
        int a,b;
        cin>>s;
        if(s[0]=='C'){
    
    
            cin>>a>>b;
            my_union(a,b);
        }else if(s[1]=='1'){
    
    
            cin>>a>>b;
            if(find(a)==find(b)){
    
    
                cout<<"Yes"<<endl;
            }else{
    
    
                cout<<"No"<<endl;
            }
        }else{
    
    
            cin>>a;
            int f=find(a);
            cout<<se[f]<<endl;
        }
    }
        
    return 0;
}

240. Preguntas prácticas sobre la cadena alimentaria y la recolección

ps: la forma recursiva de búsqueda dp-memoized (el intervalo dp es mejor para entender cuando se escribe como recursividad)

Supongo que te gusta

Origin blog.csdn.net/BOWWOB/article/details/109303147
Recomendado
Clasificación