洛谷P2241 统计方形(数据加强版)
这个题的思路就是计算正方形的个数和矩形的个数,长方形的个数就是矩形个数减去正方形的个数
在坐标阵中(以左上角第一个格子为(1,1)),遍历整个矩阵,坐标(i,j)对应的正方形就是右上坐标为(i-min(i,j),j-min(i,j))的正方形,所以每个点都可以找到唯一的正方形,不会重复(大小可能一样,但是右下坐标不同),所有的正方形就是每一个点对应的正方形相加。
同理,坐标为(i,j)的点对应的矩形的个数是i*j(包括了正方形),也是不会重复的,总数也是各个相加。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
long long ans1=0,ans2=0;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ans1 += min(i,j); //正方形的个数 仔细想想 因为固定了右下角的坐标 肯定不会重复 (1,2)(1,3)都只记一个
ans2 += i*j; //矩形的个数 固定右下角坐标
}
}
cout<<ans1<<" "<<ans2-ans1<<endl; //长方形的个数就是矩形(包括正方形)减去正方形
return 0;
}
我又又又是看题解的,参考了某个大佬的题解,感觉真的好巧妙啊,希望自己能记住在坐标中正方形的个数计算min(i,j)以及矩形的个数ij,我好菜啊,连这都不知道,加油加油*