P11001【连连看】题解
这道题有一定的思维难度,不过不是特别难想。
题意简述
给定一个矩阵,求有多少对点值相等并且在同一个正方形的对角线上的两个顶点。从
样例分析
| 1 | 2 |
|---|---|
| 2 | 3 |
| 3 | 2 |
我们可以结合样例理解题意,如上图。我们可以看出两个正方形,分别是
| 1 | 2 |
|---|---|
| 2 | 3 |
和
| 2 | 3 |
|---|---|
| 3 | 2 |
第一个正方形,两个
第二个正方形,两个
大致思路
通过样例,我们可以猜测,我们是否可以通过对角线来计算答案呢?
我们依旧结合样例来验证这个思路。观察可知,共有
另造一组样例试试。
| 1 | 1 | 1 |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 1 | 1 |
共有
最终答案为
并且,根据这个样例,可以分析得知,对于一条对角线上的
根据上述思路,我们可以遍历所有对角线,统计每条对角线上的数字以及数量,计算贡献即可。
警示后人
对于打暴力的玩家 (我是不会告诉你我一开始就是打的暴力的),分两种情况。
- 20 pts,
\Theta(n^4) ,枚举点对。 - 35~40 pts,
\Theta(n^3) ,枚举顶点和正方形边长。
可见暴力拿不到高分,建议写正解。
时间复杂度
总共有
作者实测,本题用 C++ 14(GCC 9) 是最快的。开 O2 时间 700ms,不开 O2 时间 1.1s,当前最优解。?
每个人有自己的写法,所以代码就不放了,留给读者自己发挥,并且真挚地希望读者都能够彻底理解这道题的原理。