开小了就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;
}