2021牛客第四场
E:
J:
显然可以分成两部分求解,二分答案,所有数减去mid后维护前缀和,若存在大于x的区间大于0,就是ok的
这题的本质其实是wqs二分,也就是对每个值减去mid,求最大avg 然后如果 \(x\) 在 \(l(c), r(c)\) 是中,那么解就有了。
double a[maxn], b[maxn];
void run(){
int n = rd(), m = rd(), x = rd(), y = rd();
for(int i = 1; i <= n; ++ i) scanf("%lf", &a[i]);
for(int i = 1; i <= m; ++ i) scanf("%lf", &b[i]);
function<double(double *, int, int)> get;
get = [&](double *a, int n, int k) {
static double w[maxn];
double l = 0, r = 0, res = 0; for(int i = 1; i <= n; ++ i) r = max(a[i], r);
for(int i = 1; i <= 100; ++ i) {
double mid = (l + r) / 2.0;
bool f = 0;
for(int i = 1; i <= n; ++ i) w[i] = w[i - 1] + a[i] - mid;
double mn = 10000000000.0;
for(int i = k; i <= n; ++ i) {
mn = min(w[i - k], mn);
if(mn < w[i]) {
f = 1; res = mid; break;
}
}
if(f) l = mid;
else r = mid;
}
return res;
};
printf("%.10lf\n", get(a, n, x) + get(b, m, y));
}

浙公网安备 33010602011771号