全部MLE求调T_T
查看原帖
全部MLE求调T_T
643818
I_AK_CTS楼主2024/8/4 13:44

开小了就RE,开大了就MLE T_T

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 2e7 + 5;
ll head[N], fa[N];
void init() {
    for (int i = 1; i <= N - 5; ++i) {
        fa[i] = i;
    }
}
struct edge {
    ll nxt, v, dis, u;

    bool operator<(const edge &a) const {
        return dis < a.dis;
    }
};
ll get_root(ll x) {
    if (x == fa[x]) {
        return fa[x];
    }
    return fa[x] = get_root(fa[x]);
}
edge adj[N];
ll cnt_edge;
void add(ll u, ll v, ll w) {
    adj[++cnt_edge].nxt = head[u];
    adj[cnt_edge].v = v;
    adj[cnt_edge].u = u;
    adj[cnt_edge].dis = w;
    head[u] = cnt_edge;
}
ll n, m;
int main() {
    init();
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= n; ++i) {
        ll x;
        scanf("%lld", &x);
        for (int j = 1; j < m; ++j) {
            add((i - 1) * m + j, (i - 1) * m + j + 1, x);
        }
    }
    for (int i = 1; i <= m; ++i) {
        ll x;
        scanf("%lld", &x);
        for (int j = 1; j < n; ++j) {
            add(i + (j - 1) * m, i + j * m, x);
        }
    }
    sort(adj + 1, adj + 1 + cnt_edge);
    ll k = 0;
    ll ans = 0;
    for (ll i = 1; i <= cnt_edge; ++i) {
        ll u = adj[i].u, v = adj[i].v;
        if (get_root(u) != get_root(v)) {
            fa[get_root(u)] = get_root(v);
            ans += adj[i].dis;
            ++k;
        }
        if (k == n * m - 1) {
            break;
        }
    }
    cout << ans << endl;
    return 0;
}
2024/8/4 13:44
加载中...