P3745 学习笔记
省流:三分水蓝。
设经过操作后所有成绩全部公布的时间为 \(x\),所获得的不愉快度为 \(f(x)\)。
经过我们的一顿分析猛如虎,我们知道 \(f(x)\) 是一个下凸单峰函数,于是乎——我们可使用三分找到极值点。
其实我不太会三分
code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <iterator>
#include <map>
#include <unordered_map>
#include <queue>
#include <string>
#include <cstring>
#include <set>
#include <bitset>
#include <unordered_set>
#include <vector>
#include <deque>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <list>
#include <array>
#include <iterator>
#include <cmath>
#include <new>
#include <random>
#include <cfloat>
#include <cstdlib>
#include <climits>
#include <numeric>
#include <complex>
#include <ctime>
#include <chrono>
#include <thread>
#include <mutex>
#include <future>
#include <exception>
#include <stdexcept>
#include <cstdint>
#include <cassert>
#include <stack>
#include <cctype>
#define int long long
using namespace std;
using ll = long long;
using ull = unsigned long long;
using lb = long double;
constexpr int mod = 998244353;
constexpr int maxn = 100005;
int n, m, A, B, C, ans;
int t[maxn], b[maxn];
int calc1(int p) {
int 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;
}
int calc2(int p) {
int sum = 0;
for (int i = 1; i <= n; i++)
if (t[i] < p)
sum += (p - t[i]) * C;
return sum;
}
int32_t main() {
cin >> A >> B >> C >> n >> m;
for (int i = 1; i <= n; i++)
cin >> t[i];
for (int i = 1; i <= m; i++)
cin >> b[i];
sort(t + 1, t + n + 1);
sort(b + 1, b + m + 1);
if (C >= 1e16)
return cout << calc1(t[1]), 0;
ans = 1e16 - 1;
int l = 1, r = maxn;
while (r - l > 2) {
int mid1 = l + (r - l) / 3;
int mid2 = r - (r - l) / 3;
int c1 = calc1(mid1) + calc2(mid1);
int c2 = calc1(mid2) + calc2(mid2);
if (c1 <= c2)
r = mid2;
else
l = mid1;
}
for (int i = l; i <= r; i++) {
int x = calc1(i) + calc2(i);
ans = min(ans, x);
}
cout << ans;
}

浙公网安备 33010602011771号