P2241 统计方形题解

题目传递门

解题思路:

1、正方形

我们以\((3,2)\)为图形右下角端点进行解释,这时可以构成的正方形共两个,一个是边长为\(1\)的,另一个是条边为\(2\)的,没有其它的了。为什么\((3,2)\)两个数字,一个是\(3\),一个是\(2\),结果受限于后面的\(2\),而无法突破呢?因为要照顾短的嘛。所以此时正方形个数=\(min(x,y)\)个。

2、矩形

用笔画一下,就知道,一个长为\(3\),宽度为\(2\)的矩形,以现有右下角端点为右下角端点的子矩形个数是\(3 \times 2=6\)个,所以矩形个数=\(x \times y\)个。

3、长方形

长方形个数=矩形个数-正方形个数

二、C++代码

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;

/**
 母题:P1548
 一、算正方形的个数
枚举每一个格子,看以它为左上角的矩形共有多少个(正方形与长方形同属于矩形)

二、算长方形个数(矩形=长方形+正方形)
1.其实算长方形并不常见,但算矩形大家应该经常遇到,所以如果你会算矩形,再联系第一个问题,那答案就转化为 矩形个数-正方形个数.
2.像求解正方形个数一样,固定矩形右下角(i,j),显然此时矩形个数为i*j.
3.同理,求和即可.然后,再减去正方形的个数就是长方形的个数啦。
*/
LL n, m, s1, s2;

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            s1 += min(i, j);//也可以理解为左上角
            s2 += i * j;    //也可以理解为左上角开始,也是一样的
        }
    cout << s1 << " " << s2 - s1 << endl;
    return 0;
}
posted @ 2021-07-18 13:32  糖豆爸爸  阅读(146)  评论(0)    收藏  举报
Live2D