HDU 2524 矩形A + B
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2524
感受:看到题目的时候感觉一点思路都没有,baidu之后也就明白了。这样做是不是错误的?碰到没什么想法的题目就百度,似乎不是什么好习惯。这道题目是不是属于找规律类型的呢?这两天几只大牛都去省赛了,等他们回来请教请教。
[转载+小修改]:http://www.cnblogs.com/jaskist/archive/2009/05/13/1456311.html
分析:应该是简单题一个吧。
用矩阵来分析一下题目。
设一矩阵d[i,j],d[i,j]表示为网格grid[i,j]中,所有矩形含有第[i,j]此格的总数。
d的其中一些数据为:
|
|
1 |
2 |
3 |
4 |
|
1 |
1 |
2 |
3 |
4 |
|
2 |
2 |
4 |
6 |
8 |
|
3 |
3 |
6 |
9 |
12 |
|
4 |
4 |
8 |
12 |
16 |
发现是很有规律的{ g(n,m)=n*m } 。并且每一行(列)都是一个等差数列。
继续说下去的时候,先加入一个函数g(n,m),
g(i,m) = d[i,1]+d[i,2]+d[i,3]+...+d[i,m] = (d[i,1]+d[i,m])*m/2
= (d[i,1]+d[i,1]*m)*m/2 = (i+i*m)*m/2
= i*(m+m^2)/2。
简单点说,就是d矩阵里面的第 i 行的前 m 列和。
好了,然后再看另一个矩阵sum[i,j],sum[i,j]就是题目要求的答案。
|
|
1 |
2 |
3 |
4 |
|
1 |
1 |
3 |
6 |
10 |
|
2 |
3 |
9 |
18 |
30 |
|
3 |
6 |
18 |
36 |
60 |
|
4 |
10 |
30 |
60 |
100 |
再次新发现,sum[i,j]的值也是有规律的。例如:sum[3,3] = g(3,3) + g(2,3) + g(1,3)。
所以得到
sum[n,m] = g(1,m) + g(2,m) + g(3,m) + ... + g(n,m)
= 1*(m+m^2)/2 + 2*(m+m^2)/2 + 3*(m+m^2)/2 + ... + n*(m+m^2)/2
= ((1+n)*n/2)*((m+m^2)/2)
= (n+n^2)*(m+m^2)/4
好了,有这个公式可以直接代码了。
#include<iostream> using namespace std; int main() { int n,m,time; cin>>time; while(time--) { cin >> n >> m ; cout << (n*(1+n)*m*(1+m))/4 <<endl; } return 0; }
浙公网安备 33010602011771号