每日一题:点(数学)

点(数学)

递推关系:

根据题意,列出以下方程
S = ∑ i 1 n ( x i − ∑ j = 1 n x j ) 2 + ∑ i , j = 1 n ( y i − ∑ j = 1 n y j ) 2 (1) S = \sum_{i1}^{n}(x_i- \sum_{j=1}^{n}x_j)^2+\sum_{i,j=1}^{n}(y_i-\sum_{j=1}^{n}y_j)^2\tag{1} S=i1n(xij=1nxj)2+i,j=1n(yij=1nyj)2(1)
单独考虑 x x x
S = ∑ i , j = 1 n ( x i 2 + x j 2 − ( x i x j + x j x i ) ) (2) S = \sum_{i,j=1}^{n}(x_i^2+x_j^2-(x_ix_j+x_jx_i))\tag{2} S=i,j=1n(xi2+xj2(xixj+xjxi))(2)
相当于与每一个其它点做一次差,所以有 n − 1 n-1 n1个平方项,后面的部分每一个 i i i和其余 j j j都要有两次交叉相乘项
S = ∑ i n ( n − 1 ) x i 2 − ( ( ∑ i = 1 n x i ) 2 − ∑ i = 1 n x i 2 ) (3) S = \sum_{i}^{n}(n-1)x_i^2-((\sum_{i=1}^nx_i)^2-\sum_{i=1}^nx_i^2)\tag{3} S=in(n1)xi2((i=1nxi)2i=1nxi2)(3)
预先处理平方和和和的平方,可以在 O ( n ) O(n) O(n)的时间之内算出来结果

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
typedef long long LL;

const int N = 100010;
int n;
int x[N], y[N];

LL get(int x[])
{
    LL s1 = 0, s2 = 0;
    for (int i = 0; i < n; i ++ )
    {
        s1 += x[i] * x[i];
        s2 += x[i];
    }
    
    return (n - 1) * s1 - s2 * s2 + s1;
}

int main()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        cin >> x[i] >> y[i];
    }
    
    cout << get(x) + get(y) << endl;
    return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shirandexiaowo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值