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);
}
posted @ 2022-08-28 22:10  TLE_Automation  阅读(26)  评论(0)    收藏  举报