codeforces 891 (div3)857E - Power of Points
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];
}
}