HDU 2993. MAX Average Problem

Brief description:

讀入一列正數N,a1, a2, …, aN,以及一個數F。
定義ave(i,j) = ai 到 aj 的平均值, 要求 j-i+1 >= k,
求一個最大的ave(i,j)

Analysis:

。。每次詢問固定一點 (x, y) 與之前某點所形成直線的最大斜率。
單調隊列維護下凸殼即可(x 單調)。

//}/* .................................................................................................................................. */

const int N = int(1e5) + 9;
int s[N], q[N], cz, op;
int n, k;

LL det(LL x0, int y0, LL x1, int y1){
    return x0*y1 - x1*y0;
}

int dett(int p0, int p1, int p2){
    LL t = det(p1-p0, s[p1]-s[p0], p2-p0, s[p2]-s[p0]);
    return t < 0 ? -1 : t > 0;
}


int main(){

#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#endif

    while (~scanf("%d %d", &n, &k)){
        REP_1(i, n) s[i] = s[i-1] + RD();

        DB z = 0; cz = 0, op = -1; FOR_1(i, k, n){
            int ii = i-k;
            while (cz < op && dett(q[op-1], q[op], ii) <= 0) --op; q[++op] = ii;
            while (cz < op && dett(q[cz], q[cz+1], i) >= 0) ++cz;
            checkMax(z, (DB)(s[i] - s[q[cz]] ) / (i - q[cz]));
        }
        OT(z);
    }
}

http://www.cnblogs.com/Free-rein/archive/2012/08/09/2630190.html
http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=2798173