HDU 6052 To my boyfriend 期望 计数

来源:互联网 发布:java if 编辑:程序博客网 时间:2024/06/08 00:31

链接

http://acm.hdu.edu.cn/showproblem.php?pid=6052

题意

给一个矩阵,矩阵上个点有不同的数值,概率均等地选一个矩形,问矩形中不同数值的期望个数

思路

因为是概率均等地选矩形,这个问题变成了一个统计问题。

怎么统计晚上再写把……代码有点复杂,先贴代码

代码

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;template<class T1, class T2> inline void gmax(T1 &a, T2 b) { if (a < b) a = b; }template<class T1, class T2> inline void gmin(T1 &a, T2 b) { if (a > b) a = b; }int n, m;int g[MAXN][MAXN];int pre[MAXN * MAXN][MAXN], nxt[MAXN][MAXN], col[MAXN * MAXN];int first_points[MAXN * MAXN][MAXN];double ans, sum;int main() {  int T;  scanf("%d", &T);  while (T--) {    scanf("%d%d", &n, &m);    for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) scanf("%d", &g[i][j]);    for (int i = 0; i < n * m; ++i) for (int j = 1; j <= m; ++j) pre[i][j] = 0;    for (int j = 1; j <= m; ++j) {      for (int i = 0; i < n * m; ++i) col[i] = n + 1;      for (int i = n; i; --i) {        nxt[i][j] = col[g[i][j]];        col[g[i][j]] = i;      }      for (int i = 0; i < n * m; ++i) first_points[i][j] = col[i];    }    ans = 0;    int a, b, now;    for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) {      now = g[i][j];      a = 0;      b = nxt[i][j];      pre[now][j] = i;      ans += j * i * (b - i);      for (int k = 1; j + k <= m; ++k) {        if (g[i][j + k] == g[i][j]) break;        gmax(a, pre[now][j + k]);        if (pre[now][j + k]) gmin(b, nxt[pre[now][j + k]][j + k]);        else gmin(b, first_points[now][j + k]);        ans += j * (i - a) * (b - i);      }    }    sum = 1. * (n + 1) * (m + 1) * n * m / 4;    printf("%.9f\n", ans / sum);  }}
原创粉丝点击