给定数组中的一组 N 个数字。给出 Q 查询。每个查询包含 1 个数字 x。
对于每个查询,您需要将 x 添加到数组的每个元素,然后报告数组中的绝对值之和。
注意:对数组的更改是永久性的。请参阅示例以获取更多说明。
输入格式
第一行包含 N ,即数组中的元素数量。 下一行包含数组的 N 个空格分隔的整数。 下一行包含 Q(查询数)。 下一行包含 Q 个空格分隔的整数(数字 x)。
输出格式
对于每个查询,在换行符中输出总和。
约束
1≤N≤500000
1≤Q≤500000
-2000 ≤ 每个查询中的数量 ≤ 2000
-2000 ≤ 数组元素的值 ≤ 2000
示例输入
3
-1 2 -3
3
1 -2 3
示例输出
5
7
6
说明
查询 1 后:[ 0 , 3 , -2 ] => sum = 0 + 3 + 2 = 5
查询 2 后:[ -2 , 1 , -4 ] => sum = 2 + 1 + 4 = 7
查询 3 后:[ 1 , 4 , -1 ] => sum = 1 + 4 + 1 = 6
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,*a,q,*aq;
long int sum=0;
scanf("%d",&n);
a=(int*)malloc(sizeof(int)*n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&q);
aq=(int*)malloc(sizeof(int)*q);
for(int i=0;i<n;i++)
scanf("%d",&aq[i]);
for(int i=0;i<q;i++)
{
for(int j=0;j<n;j++)
{
sum+=abs(aq[i]+a[j]);
a[j]=aq[i]+a[j];
}
printf("%ld\n",sum);
sum=0;
}
}
一些测试用例超时。
最佳答案
您的解决方案正在执行 N.Q 操作,这是一个巨大的操作。
首先请注意,数据的范围适中,因此您可以使用 4001 个条目的直方图来表示 N 个数字。该直方图是通过 N 次操作计算的(加上初始化 bin)。
然后,获得请求的总和,作为每个 bin 的绝对差值之和,并按 bin 值加权。这将工作负载从 N.Q 降低到 B.Q(B 是 bin 的数量)。
如果我是对的,我们可以通过将总和分解为负值和正值的子总和来做得更好。这些和是通过计算前缀和获得的。在 B 运算中预处理直方图后,这应该会在 Q 运算中得到解决方案。
关于algorithm - 如何以最佳时间复杂度有效地解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53875405/