栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3614 Choir

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3614 Choir

#include <iostream>#include <cstring>#include <cstdio>#include <cmath>using namespace std;#define LL long longconst double eps = 1e-9;const double INF = 1e10;const int maxn = 310;int sum[maxn][maxn];LL squ[maxn][maxn];int mx[10][10][maxn][maxn];int m, n, a, b, x, y;double ans;void rmqinit(){    for(int r = 0; (1 << r) < m; r++){        for(int c = 0; (1 << c) < n; c++){ if(r == 0 && c == 0) continue; for(int i = m; i >= 1; i--){     for(int j = n; j >= 1; j--){         if(r == 0){  mx[r][c][i][j] = mx[r][c - 1][i][j];  if(j + (1 << (c - 1)) <= n)      mx[r][c][i][j] = max(mx[r][c][i][j], mx[r][c - 1][i][j + (1 << (c - 1))]);         }else {  mx[r][c][i][j] = mx[r - 1][c][i][j];  if(i + (1 << (r - 1)) <= m)      mx[r][c][i][j] = max(mx[r][c][i][j], mx[r - 1][c][i + (1 << (r - 1))][j]);         }     } }        }    }}int rmq(int r1, int c1, int r2, int c2){    int m1 = max((int)floor(log((double)(r2 - r1 + 1)) / log(2.0) - eps), 0);    int m2 = max((int)floor(log((double)(c2 - c1 + 1)) / log(2.0) - eps), 0);    return max(max(mx[m1][m2][r1][c1], mx[m1][m2][r1][c2 - (1 << m2) + 1]), max(mx[m1][m2][r2 - (1 << m1) + 1][c1], mx[m1][m2][r2 - (1 << m1) + 1][c2 - (1 << m2) + 1]));}inline void slove(int u, int i, int j){    int _sum = sum[i][j] - u;    LL _squ = squ[i][j] - u * u;    if(i + a <= m){        _sum -= sum[i + a][j];        _squ -= squ[i + a][j];    }    if(j + b <= n){        _sum -= sum[i][j + b];        _squ -= squ[i][j + b];    }    if(i + a <= m && j + b <= n){        _sum += sum[i + a][j + b];        _squ += squ[i + a][j + b];    }    int c = a * b - 1;    double avg = (double)_sum / c;    double v = (double)_squ / c + avg * avg - 2.0 * avg * _sum  / c;    if(ans > v){        ans = v;        x = i;        y = j;    }}int main(){    int q, con = 1;    while(scanf("%d %d", &m, &n) == 2){        printf("Case %d:n", con++);        for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++)     scanf("%d", &mx[0][0][i][j]);        for(int j = m; j >= 1; j--){ int _sum = 0; LL _squ = 0; for(int i = n; i >= 1; i--){     if(j < m) {         sum[j][i] = sum[j + 1][i];         squ[j][i] = squ[j + 1][i];     }else {         sum[j][i] = 0; squ[j][i] = 0;     }     _sum += mx[0][0][j][i];     _squ += mx[0][0][j][i] * mx[0][0][j][i];     sum[j][i] += _sum;     squ[j][i] += _squ; }        }        rmqinit();        scanf("%d", &q);        while(q--){ scanf("%d %d", &a, &b); ans = INF; for(int i = 1; i + a - 1 <= m; i++){     for(int j = 1; j + b - 1 <= n; j++){         int u = rmq(i, j, i + a - 1, j + b - 1);         slove(u, i, j);     } } printf("(%d, %d), %.2lfn", x, y, ans);        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/379476.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号