CF-Round-#626-Div. 2-B题
B. Count Subrectangles
题目大概意思就是构造出一个矩阵,然后是否存在面积为k的全1子矩阵。输出个数。
这个题目是一个模拟贪心把。。
一看到矩阵我就慌。。。尽管它是B题。
比较好想。
找出k的因子。
这些因子就是符合要求的子矩阵的长和宽。
长存在于a[]数组中
宽存在于b[]数组中
我们不需要求出矩阵c[]的各个元素。
就是在a[]数组和b[]数组上面操作就可以啦。
寻找到a[]数组的符合要求的长度连续全1的个数
寻找到b[]数组的符合要求的长度连续全1的个数
小tips在代码部分
只要一到达符合要求的长度,就–一次。然后计数++一次
下次就可以连续求个数了
只要碰到0就另计数为0
代码部分:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e4 + 10;
int a[N];
int b[N];
int c[N];
ll ans;
int main()
{
int n, m, k;
cin >> n >> m >> k;
for (int i = 0; i < n; i++)
{
scanf ("%d", &a[i]);
}
for (int i = 0; i < m; i++)
{
scanf ("%d", &b[i]);
}
int cnt = 0;
for (int i = 1; i * i <= k; i++)
{
if (!(k % i))
{
c[cnt++] = i;
if (i == k / i)
{
continue;
}
c[cnt++] = k / i;
}
}
for (int i = 0; i < cnt; i++)
{
int t = 0;
ll x = 0, y = 0;
for (int j = 0; j < n; j++)
{
if (a[j] == 1)
{
t++;
}
else
{
t = 0;
}
if (t == c[i])
{
t--;
x++;
}
}
t = 0;
for (int j = 0; j < m; j++)
{
if (b[j] == 1)
{
t++;
}
else
{
t = 0;
}
if (t == k / c[i])
{
t--;
y++;
}
}
ans += x * y;
}
cout << ans << endl;
return 0;
}