CF#626 B. Count Subrectangles(计数)

一开始如果把他的行列输入理解为矩阵就错了。
先for从前往后扫一下,求出以每个行列为截止的最大线段长度。(这个跟求序列每个位置的连续递增长度类似)
然后枚举k的约数,将符合条件的行列个数求出来,并计数。
计数经验题。

const int N = 1e6 + 5;
int t;
int a[40010], b[40010];
int la[40010], lb[40010];
int main()
{
	int n, m, k;
	while (cin >> n >> m >> k)
	{
		f(i, 1, n)scanf("%d", &a[i]);
		f(i, 1, m)scanf("%d", &b[i]);
		f(i, 1, n)if(a[i]==1)la[i] = la[i - 1] + a[i];
		f(i, 1, m)if(b[i]==1)lb[i] = lb[i - 1] + b[i];
		ll ans=0,cot = 0, cot2 = 0;
		f(i, 1, n)
		{
			if (k%i == 0)
			{
				cot = 0, cot2 = 0;
				f(j, 1, n)
					if (la[j] >= i)cot++;
				f(j, 1, m)
					if (lb[j] >= k / i)cot2++;
				ans += cot * cot2;
			}	
		}
		cout << ans << endl;
	}
	return 0;
}

你可能感兴趣的:(Codeforces,pupil)