日常刷题2025-3-18

日常刷题2025-3-18

经验+1

一个数有多少个正因数?首先根据算术基本定理,每个数都可以写成 \(a=\prod_{i=1}^{m}p_i^{e_i}\)的形式,那么 a 的正因素的个数 \(d(a)=\sum_{i=1}^{m}(e_i+1)\)

此题用到了这个定理:https://atcoder.jp/contests/abc383/tasks/abc383_d

P1967 [NOIP 2013 提高组] 货车运输

蓝色

https://www.luogu.com.cn/problem/P1967

思路:最大生成树

由于还没有学LCA和启发式合并,所以导致此题只能得60分

代码

#include <bits/stdc++.h>

using u64 = unsigned long long;
using i64 = long long;
typedef std::pair<int, int> pii;
const int mod = 998244353;
const long long LINF = 1e18;

const int N = 1e4+5, M = 5e4+4;

struct Node{
    int x,y,v;
    bool operator<(const Node& a)const{
        return v>a.v;
    }
}edge[M];

int n, m, fa[N], ans[N];

int getf(int x){
    if(x==fa[x])return x;
    return fa[x]=getf(fa[x]);
}

int ck(int x,int y){
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        int f1=getf(edge[i].x),f2=getf(edge[i].y);
        if(f1==f2)continue;
        fa[f1]=f2;
        if(getf(x)==getf(y)){
            return edge[i].v;
        }
    }
    return -1;
}

void solve(){
    std::cin>>n>>m;
    for(int i=1;i<=m;i++){
        std::cin>>edge[i].x>>edge[i].y>>edge[i].v;
    }
    std::sort(edge+1,edge+m+1);
    int q; std::cin>>q;
    while(q--){
        int x, y; std::cin>>x>>y;
        if(x>n||y>n) {
            std::cout<<"-1\n";
            continue;
        }
        int res=ck(x, y);
        if(res==-1){
            std::cout<<"-1\n";
            continue;
        }
        std::cout<<res<<'\n';
    }
}

signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(15);

    int t = 1, i;
    for (i = 0; i < t; i++){
        solve();
    }

    return 0;
}
posted @ 2025-03-18 12:39  califeee  阅读(2)  评论(0)    收藏  举报