luogu P4694 [PA2013]Raper
https://www.luogu.com.cn/problem/P4694
首先可以用\(wqs\)二分去掉\(K\)的那个限制
然后可以发现剩下的就是一个模拟费用流了
code:
#include<bits/stdc++.h>
#define ll long long
#define N 500050
using namespace std;
int n, k, a[N], b[N];
ll ans;
int check(ll mid) {
priority_queue<pair<ll, int> > q;
ans = 0;
int ret = 0;
for(int i = 1; i <= n; i ++) {
q.push(make_pair(- a[i], 0));
int x = -q.top().first, y = q.top().second;
if(x + b[i] + mid <= 0) {
ans += x + b[i] + mid;
if(!y) ret ++;
q.pop(); q.push(make_pair(b[i] + mid, -1));
}
}
return ret >= k;
}
int main() {
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i ++) scanf("%d", &b[i]);
ll l = -1e12, r = 1e12;
while(l + 1 < r) {
ll mid = (l + r) >> 1;
if(check(mid)) l = mid;
else r = mid;
}
check(l);
printf("%lld", ans - l * k);
return 0;
}