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));
}


posted @ 2021-07-26 21:03  wlhp  阅读(6)  评论(0)    收藏  举报