codeforces 891 (div3)857E - Power of Points

发布时间 2023-08-08 15:24:55作者: liuwansi

E. 点的力量

每个测试限时2秒
每个测试限制内存为256兆字节
输入以标准格式输入
输出以标准格式输出

给定n个具有整数坐标x1,…xn的点,这些点位于数线上。对于某个整数s,我们构建段[s, x1],[s, x2],…,[s, xn]。注意,如果xi<s,则段将类似于[xi, s]。段[a, b]覆盖了所有整数点a,a+1,a+2,…,b。我们定义点p的力量为与坐标p相交的段的数量,表示为fp。您的任务是计算总和∑p=1109fp,对于每一个s∈{x1,…,xn},即从1到109的所有整数点的fp的和。
例如,如果初始坐标为[1,2,5,7,1],我们选择s=5,那么段将是:[1,5],[2,5],[5,5],[5,7],[1,5]。点的力量将是:f1=2,f2=3,f3=3,f4=3,f5=5,f6=1,f7=1,f8=0,…,f109=0。它们的和是2+3+3+3+5+1+1=18。

输入

第一行包含一个整数t(1≤t≤104)- 测试的数量。每个测试用例的第一行包含一个整数n(1≤n≤2⋅105)- 点的数量。
第二行包含n个整数x1,x2…xn(1≤xi≤109)- 点的坐标。保证所有测试用例中n的值的总和不超过2⋅105。

输出

对于每个测试用例,输出n个整数,其中第i个整数等于s=xi时所有点的力量之和。

示例

输入示例

3
3
1 4 3
5
1 2 5 7 1
4
1 10 100 1000

输出示例

8 7 6
16 15 18 24 16
1111 1093 1093 2893

说明

在第一个测试用例中,我们首先选择s=x1=1,然后形成以下段:[1,1],[1,4],[1,3]。

点的力量将如下所示:f1=3,f2=2,f3=2,f4=1,f5=0...点的力量之和:3+2+2+1+0+⋯+0=8。

然后我们选择s=x2=4。然后会有这样的段:[1,4],[4,4],[3,4],点的力量是f1=1,f2=1,f3=2,f4=3。

最后我们取s=x3=3,段看起来像这样:[1,3],[3,4],[3,3],点的力量是f1=1,f2=1,f3=3,f4=1。

示范代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 200005;
#define int long long
pair<int,int> x[N];
int a[N];
signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int s1=0,s2=0;
        for(int i=1;i<=n;i++)
        {
            cin>>x[i].first;
            x[i].second=i;
            s2+=x[i].first;
        }
        sort(x+1,x+n+1);
        for(int i=1;i<=n;i++)
        {
            s2-=x[i].first;
            s1+=x[i].first;
            a[x[i].second]=n+x[i].first*(2*i-n)-s1+s2;
        }
        for(int i=1;i<=n;i++)cout<<a[i]<<" \n"[i==n];
    }
}