题目意思
给一个T表示案例个数,然后每个案例给出三个数字n(0 < n <= 100000),m(0 < m <= 100),k(0 < k <= 100000),表示有n*m的方格,方格中有k个黑色方格,后面k行,每行给一个黑色方格的坐标(x,y),其中保证(0
解题思路
暴力大法好。。。
up数组表示遍历到第i行时(即up更新第i次时),每一列的黑格子所在的最高行
AC代码
#include <iostream>
#include <climits>
#include <algorithm>
#include <cstring>
using ll = long long;
using namespace std;
int e[100005][105], up[105];
int main()
{
int t, n, m, k, a, b, ccase = 1;
scanf("%d", &t);
while (t--)
{
ll ans = 0;
memset(e, 0, sizeof e);
memset(up, 0, sizeof up);
scanf("%d%d%d", &n, &m, &k);
while (k--)
{
scanf("%d%d", &a, &b);
e[a][b] = 1;
}
for (int i = 1; i <= n; i++)//枚举每一行
{
for (int j = 1; j <= m; j++)
if (e[i][j])
up[j] = i;//更新值
for (int j = 1; j <= m; j++)
{
ll temp = LLONG_MAX;//temp为了计算深度最大可以达到多少
for (int k = j; k >= 1; k--)
{
temp = min(temp, (ll)(i - up[k]));
ans += temp;
}
}
}
printf("Case #%d: %lld\n", ccase++, ans);
}
}