We have a grid with H rows and W columns. The square at the i-th row and the j-th column will be called Square (i,j).
The integers from 1 through H×W are written throughout the grid, and the integer written in Square (i,j) is Ai,j.
You, a magical girl, can teleport a piece placed on Square (i,j) to Square (x,y) by consuming |x−i|+|y−j| magic points.
You now have to take Q practical tests of your ability as a magical girl.
The i-th test will be conducted as follows:
-
Initially, a piece is placed on the square where the integer Li is written.
-
Let x be the integer written in the square occupied by the piece. Repeatedly move the piece to the square where the integer x+D is written, as long as x is not Ri. The test ends when x=Ri.
-
Here, it is guaranteed that Ri−Li is a multiple of D.
For each test, find the sum of magic points consumed during that test.
Constraints- 1≤H,W≤300
- 1≤D≤H×W
- 1≤Ai,j≤H×W
- Ai,j≠Ax,y((i,j)≠(x,y))
- 1≤Q≤105
- 1≤Li≤Ri≤H×W
- (Ri−Li) is a multiple of D.
Input is given from Standard Input in the following format:
H W D A1,1 A1,2 … A1,W : AH,1 AH,2 … AH,W Q L1 R1 : LQ RQOutput
For each test, print the sum of magic points consumed during that test.
Output should be in the order the tests are conducted.
Sample Input 13 3 2 1 4 3 2 5 7 8 9 6 1 4 8Sample Output 1
5
-
4 is written in Square (1,2).
-
6 is written in Square (3,3).
-
8 is written in Square (3,1).
Thus, the sum of magic points consumed during the first test is (|3−1|+|3−2|)+(|3−3|+|1−3|)=5.
Sample Input 24 2 3 3 7 1 4 5 2 6 8 2 2 2 2 2Sample Output 2
0 0
Note that there may be a test where the piece is not moved at all, and there may be multiple identical tests.
Sample Input 35 5 4 13 25 7 15 17 16 22 20 2 9 14 11 12 1 19 10 6 23 8 18 3 21 5 24 4 3 13 13 2 10 13 13Sample Output 3
0 5 0
Q最高100000,如果每次都要计算,会超时,先记录前缀和,直接用前缀和相减就好了。
代码:
#include <bits/stdc++.h>///int * int = int using namespace std; int h,w,d,s[300][300],q,a,b; int x[90001],y[90001]; int dp[90001]; int main() { scanf("%d%d%d",&h,&w,&d); for(int i = 0;i < h;i ++) { for(int j = 0;j < w;j ++) { scanf("%d",&s[i][j]); x[s[i][j]] = i; y[s[i][j]] = j; } } for(int i = 1 + d;i <= h * w;i ++) { dp[i] = dp[i - d] + abs(x[i] - x[i - d]) + abs(y[i] - y[i - d]); } scanf("%d",&q); for(int i = 0;i < q;i ++) { scanf("%d%d",&a,&b); printf("%lld\n",abs(dp[a] - dp[b])); } }