题解 P2241 【统计方形(数据加强版)】
啦啦啦,经过在谷一年的潜伏,我终于想开始发题解啦!(各位管理员大大一定要对我这个蒟蒻宽容点呀!)
言归正传,对于一道水题,这是假的),但我们还是要努力去找正解。再看下题呗
1.题意分析
这道题的题意很简单,就是给你一个长方形,求出长方形里有多少个小长方形和正方形(长方形中不包括正方形)。就是这么简单,我也不啰嗦了。下面给出图(几何画板做的)。
2.解法
解法也不难,运用小学时代的公式(设长为
或
仔细品一下,好像没错吧?(应该还能推,但太麻烦了,实际应用不大)所以开始愉快地打代码吧!
代码区(勿抄)
#include<bits/stdc++.h>
using namespace std;
long long n,m,ans=0,bns=0,l[10005],r[10005],k=0;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) l[n-i+1]=i,ans+=i;//计算长方形和边个数。
for(int i=1;i<=m;i++) r[m-i+1]=i,bns+=i;
for(int i=1;i<=min(n,m);i++) k+=l[i]*r[i];
cout<<k<<" "<<ans*bns-k<<endl;
}
本来还有更好的打法,可以将时间复杂度降到
#include<bits/stdc++.h>
using namespace std;
long long n,m,ans,bns,k=0,r,l;
int main(){
cin>>n>>m;
ans=n*(n+1)/2,bns=m*(m+1)/2;
r=min(n,m),l=max(n,m);
for(int i=1;i<=r;i++) k=k+i*(i-r+l);
cout<<k<<" "<<ans*bns-k<<endl;
}
如果有公式改良版也可以私信我(放评论区),我会把您们的想法放到题解或我的博客中(如果此题无法改题解了)。
声明:这是本蒟蒻自己推的公式,如有雷同,纯属巧合,管理员大大们不要以为我作弊哟。
再说一遍:管理员大大们最好了!希望我可以看到我的题解在洛谷中公开。(一个小蒟蒻的小小小愿望)