70求条,悬一关
查看原帖
70求条,悬一关
751062
Diary_Of_Young楼主2024/11/28 19:01
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef long long LL;
int n , m , t[N] , b[N];
LL A , B , C , ans;
LL calc1(int p)
{
	LL x = 0 , y = 0;
	for(int i = 1 ; i<= m ; i ++){
		if(b[i] < p) x += p - b[i];
		else y += b[i] - p;
	}
	
	if(A < B) return min(x , y) * A + (y - min(x , y)) * B;
	else return y * B;
}

LL calc2(int p)
{
	LL sum = 0;
	for(int i = 1 ; i <= n ; i ++)
		if(t[i] < p)
			sum += (p - t[i]) * C;
	
	return sum;
}
template <typename T>
T read() {
  T sum = 0, fl = 1;  
  int ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') fl = -1;
  for (; isdigit(ch); ch = getchar()) sum = sum * 10 + ch - '0';
  return sum * fl;
}
int main()
{
	A = read<LL>(); B = read<LL>(); C = read<LL>(); n = read<LL>();m = read<LL>();
	for(int i = 1 ; i<= n ; i ++) t[i] = read<LL>();
	for(int i = 1 ; i <= m ; i ++) b[i] = read<LL>();
	sort(b + 1 , b + m + 1); sort(t + 1 , t + n + 1);
	if(C >= 1e16){
		cout << calc1(t[1]); return 0;
	}
	ans = 1e16;
	int l = 1 , r = N;
	while(r - l > 2)
	{
		int mid1 = l + (r - l) / 3; int mid2 = r - (r - l) / 3;
		LL c1 = calc1(mid1) + calc2(mid2);
		LL c2 = calc1(mid2) + calc2(mid1);
		if(c1 <= c2) r = mid2;
		else l = mid1;
	}
	for(int i = 1 ; i <= r ; i ++) 
	{
		LL x = calc1(i) + calc2(i);
		ans = min(ans , x);
	}
	printf("%lld" , ans);
	return 0;
}
2024/11/28 19:01
加载中...