传送门
- 此题与之前某一场div.2的D题一模一样(
- 我们从后往前遍历,假如当前已经遍历了k个数,那么我们能选的数就有\(\left \lfloor \frac{k}{2}\right \rfloor\)个,所以假如当前优先队列中的数没有这么多,就直接选当前的数,如果已经选了这么多个数了,就看最小的是否比当前数小做选择即可。
#include<bits/stdc++.h>
using namespace std;
long long t;
const long long N = 5e5 + 10;
long long n,a[N];
void solve() {
cin >> n;
n = 2 * n;
for(long long i = 1;i <= n;i++) cin >> a[i];
priority_queue<long long,vector<long long>, greater<long long> > q;
long long cnt = 0,ans = 0;
for(long long i = n;i >= 1;i--) {
cnt = (n - i + 1) / 2;
if(q.size() < cnt) {
q.push(a[i]);
ans += a[i];
}
else if(!q.empty()) {
if(q.top() < a[i]) {
ans -= q.top();
q.pop();
q.push(a[i]);
ans += a[i];
}
}
}
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> t;
while(t--) solve();
return 0;
}