结论题。。。。。。
分析后可以得出,操作的顺序不对结果产生影响,从而得到「至多」是假的。
给每个星定义一个势能
V(i,j)
V
(
i
,
j
)
:
如果这个星位于
(i,j)
(
i
,
j
)
,那么这个星的势能为
i2+j2
i
2
+
j
2
。
假设两个星都位于第
i
i
行,坐标分别为和
(i,k)
(
i
,
k
)
且
k−j>1
k
−
j
>
1
。
则这两个星向中间移动时,放出的势能为:
恰好等于两个区域之间所间隔区域数的 2 2 倍!
所以,求出初始状态所有星的势能之和,结束状态所有星的势能之和 sum2 s u m 2 ,那么答案就是:
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 205;
int n, m, a[N][N], b[N][N]; ll x1, x2;
inline int read() {
int res = 0; bool bo = 0; char c;
while (((c = getchar()) < '0' || c > '9') && c != '-');
if (c == '-') bo = 1; else res = c - 48;
while ((c = getchar()) >= '0' && c <= '9')
res = (res << 3) + (res << 1) + (c - 48);
return bo ? ~res + 1 : res;
}
int main() {
int i, j, l, r; n = read(); m = read();
for (i = 1; i <= n; i++) for (j = 1; j <= m; j++) a[i][j] = read();
for (i = 1; i <= n; i++) for (j = 1; j <= m; j++) b[i][j] = read();
for (i = 1; i <= n; i++) for (j = 1; j <= m; j++)
x1 += (1ll * i * i + 1ll * j * j) * a[i][j],
x2 += (1ll * i * i + 1ll * j * j) * b[i][j];
cout << (x1 - x2 >> 1) << endl;
return 0;
}