solution
除去相同颜色的已配对袜子,剩余袜子遍历颜色考虑:
- 当 前 l 总 大 于 r 总 且 a [ i ] [ 0 ] > 1 , 则 只 需 一 次 把 l 变 成 r 的 费 用 当前l_总大于r_总且a[i][0]>1,则只需一次把l变成r的费用 当前l总大于r总且a[i][0]>1,则只需一次把l变成r的费用
- 当 前 r 总 大 于 l 总 且 a [ i ] [ 1 ] > 1 , 则 只 需 一 次 把 r 变 成 l 的 费 用 当前r_总大于l_总且a[i][1]>1,则只需一次把r变成l的费用 当前r总大于l总且a[i][1]>1,则只需一次把r变成l的费用
- 剩 下 来 的 任 意 一 只 l 袜 子 , 都 没 有 一 只 同 色 r 袜 子 , 费 用 e 1 + e 2 2 + ∣ e 1 − e 2 ∣ 2 剩下来的任意一只l袜子,都没有一只同色r袜子,费用\frac{e1+e2}{2}+\frac{|e1-e2|}{2} 剩下来的任意一只l袜子,都没有一只同色r袜子,费用2e1+e2+2∣e1−e2∣
code
/*SiberianSquirrel*/
/*CuteKiloFish*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int vis[300010][2];
void solve() {
int T; cin >> T; while (T--) {
int n, l, r; cin >> n >> l >> r;
for (int i = 1; i <= n; ++ i)
for (int j = 0; j < 2; ++ j)
vis[i][j] = 0;
for (int i=1; i<=n; i++) {
int x; cin >> x;
if(i <= l) vis[x][0] ++;
else vis[x][1] ++;
}
int cost = 0;
for (int i = 1; i <= n; ++ i) {
if (vis[i][0] && vis[i][1]) {
int minn = min(vis[i][0], vis[i][1]);
vis[i][0] -= minn;
vis[i][1] -= minn;
}
}
for (int i = 1, temp = l - r; i <= n; ++ i) {
while (vis[i][0] > 1 && temp > 0) {
temp -= 2;
vis[i][0] -= 2;
cost ++;
}
while (vis[i][1] > 1 && temp < 0) {
temp += 2;
vis[i][1] -= 2;
cost ++;
}
}
int e1 = 0, e2 = 0;
for (int i = 1; i <= n; i++) {
e1 += vis[i][0];
e2 += vis[i][1];
}
cost += (e1 + e2) / 2 + abs(e1 - e2) / 2;
cout << cost << endl;
}
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#ifdef ACM_LOCAL
freopen("input", "r", stdin);
freopen("output", "w", stdout);
signed test_index_for_debug = 1;
char acm_local_for_debug = 0;
do {
if (acm_local_for_debug == '$') exit(0);
if (test_index_for_debug > 20)
throw runtime_error("Check the stdin!!!");
auto start_clock_for_debug = clock();
solve();
auto end_clock_for_debug = clock();
cout << "Test " << test_index_for_debug << " successful" << endl;
cerr << "Test " << test_index_for_debug++ << " Run Time: "
<< double(end_clock_for_debug - start_clock_for_debug) / CLOCKS_PER_SEC << "s" << endl;
cout << "--------------------------------------------------" << endl;
} while (cin >> acm_local_for_debug && cin.putback(acm_local_for_debug));
#else
solve();
#endif
return 0;
}