ブルーブリッジカップ全国大会準備DAY2

数论:
1.素数(质数)

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

②プロパティメソッド:O(sqrt(n))
はペアで表示されます
。dがnを除算できる場合、n / dもnを除算できます
。dとn / dがペアである
場合は、小さい方に列挙するだけで済みます。
回答:d <= n / d、


d d <= n PS:この書き込み方法は推奨されません。nがintの最大値に近い場合、ddにオーバーフローのリスクがある可能性があります。

d <= sqrt(n)PS:関数が毎回呼び出され、非効率的であるため、この書き込み方法はお勧めしません。

2.
除数は
素数の反対であり、慣習は素数と同じです。


統合コレクション836。統合コレクションの
タイトルリンク

以前に学んだクルスカルと同じです

#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;
}

ユニオン検索セットの拡張アプリケーション:
837。接続されたブロック内のポイント数
リンク

元のコードをマージして収集したことに基づいて変換します。

#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.食物連鎖と収集実践の質問

ps:dpでメモ化された検索の再帰形式(再帰として記述された場合、間隔dpの方が理解しやすい)

おすすめ

転載: blog.csdn.net/BOWWOB/article/details/109303147