#include<bits/stdc++.h>
using namespace std;
using P = pair<int, int>;
const int M = 1000000007;
struct edge {
int to, cap;
int cost;
int rev;
};
int V = 5010;
vector<edge> G[5010];
int h[5010];
int dist[5010];
int prevv[5010], preve[5010];
void add_edge(int from, int to, int cap, int cost) {
G[from].push_back((edge){ to, cap, cost, (int)G[to].size() });
G[to].push_back((edge){ from, 0, -cost, (int)G[from].size() - 1 });
}
int min_cost_flow(int s, int t, int f) {
int res = 0;
fill(h, h + V, 0);
while (f > 0) {
priority_queue<P, vector<P>, greater<P> > q;
fill(dist, dist + V, M);
dist[s] = 0;
q.push(P(0, s));
while (!q.empty()) {
P p = q.top();
q.pop();
int v = p.second;
if (dist[v] < p.first) continue;
for (int i = 0; i < (int)G[v].size(); ++i) {
edge &e = G[v][i];
if (e.cap > 0 && dist[e.to] > dist[v] + e.cost + h[v] - h[e.to]) {
dist[e.to] = dist[v] + e.cost + h[v] - h[e.to];
prevv[e.to] = v;
preve[e.to] = i;
q.push(P(dist[e.to], e.to));
}
}
}
if (dist[t] == M) return res;
for (int v = 0; v < V; ++v)
h[v] += dist[v];
int d = f;
for (int v = t; v != s; v = prevv[v])
d = min(d, G[prevv[v]][preve[v]].cap);
f -= d;
res += d * h[t];
for (int v = t; v != s; v = prevv[v]) {
edge &e = G[prevv[v]][preve[v]];
e.cap -= d;
G[v][e.rev].cap += d;
}
}
return res;
}
int main() {
int n, k;
cin >> n >> k;
vector<int> cnt(n);
int sum = 0;
int S = 5001, T = 5002;
vector<int> a(n), b(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
--a[i];
}
for (int i = 0; i < n; ++i) {
cin >> b[i];
--b[i];
}
for (int i = 0; i < n; ++i) {
if (a[i] != b[i]) {
add_edge(max(a[i], b[i]), min(a[i], b[i]), 1, abs(a[i] - b[i]));
}
++cnt[max(a[i], b[i])];
sum += max(a[i], b[i]) + 1;
}
int c = 0;
for (int i = 0; i < n; ++i) {
if (cnt[i] > 0) ++c;
}
if (c >= k) {
cout << sum << "\n";
return 0;
}
k -= c;
for (int i = 0; i < n; ++i) {
if (cnt[i] == 2) {
add_edge(S, i, 1, 0);
}
if (cnt[i] == 0) {
add_edge(i, T, 1, 0);
}
}
cout << sum - min_cost_flow(S, T, k) << "\n";
return 0;
}