CF76E Points
可以把题目转换成求:
\[\sum_{i = 1}^{n} \sum_{j = i + 1} ^{n} [(x_i - x_j)^2 + (y_i - y_j)^2]
\]
继续化简:
\[\begin{aligned}
&=\sum_{i = 1}^{n} \sum_{j = i + 1} ^{n} (x_i - x_j)^2 + \sum_{i = 1}^{n} \sum_{j = i + 1} ^{n} (y_i - y_j)^2
\\
&= \sum_{i = 1}^n \sum_{j = i + 1}^{n}(x_i^2-2x_ix_j+x_j^2)+\sum_{i = 1}^n \sum_{j = i + 1}^{n}(y_i^2-2y_iy_j+y_j^2)
\\
&= \sum_{i=1}^n \sum_{j=i+1}^n(x_i^2+y_i^2)+\sum_{i=1}^n \sum_{j=i+1}^n (x_j^2 + y_j^2)-2\sum_{i=1}^n\sum_{j=i+1}^n (x_ix_j + y_iy_j)
\\
&= \sum_{i=1}^{n} [(n-i)\times (x_i^2 + y_i^2)] + \sum_{i =1}^n[(i -1)\times (x_i^2 + y_i^2) ] - 2\sum_{i=1}^{n}(x_i\sum_{j=i+1}^n x_j + y_i\sum_{j=i+1}^n y_j)
\\
&=\sum_{i=1}^n[(n- 1) \times (x_i^2 + y_i^2)]- 2\sum_{i=1}^{n}(x_i\sum_{j=i+1}^n x_j + y_i\sum_{j=i+1}^n y_j)\end{aligned}\]
每一项都可以 \(\mathcal{O}(n)\) 的处理出来,总时间复杂度是 \(\mathcal{O}(n)\)。
ll x[N], y[N], hzx[N], hzy[N];
ll ans = 0;
signed main()
{
int n = read();
for(int i = 1; i <= n; i++) x[i] = read(), y[i] = read();
for(int i = n; i >= 1; i--) hzx[i] = hzx[i + 1] + x[i], hzy[i] = hzy[i + 1] + y[i];
for(int i = 1; i <= n; i++) ans += (n - 1) * ((x[i] * x[i]) + (y[i] * y[i]));
for(int i = 1; i <= n; i++) ans -= 2 * ((x[i] * hzx[i + 1]) + (y[i] * hzy[i + 1]));
printf("%lld\n", ans);
return (0 - 0);
}

codeforces 简单推式子题
浙公网安备 33010602011771号