algorithm - 如何以最佳时间复杂度有效地解决这个问题?

标签 algorithm performance logic

给定数组中的一组 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/

相关文章:

php - 使用 Yii2 框架 Ajax 请求太慢

c++ - 使用 for 循环是否比在 C++ 中将内容保存在 vector 中更快?

algorithm - 逻辑/算法 - 将列表中的选定项目作为整数存储 - 并再次撤消?

sql - 如何在 MySQL 的给定组中标记重复项?

algorithm - 优化哈里斯角点检测器

algorithm - 关注所有 Twitter 用户的最佳算法

python - Python cProfile 中的严重开销?

ruby - 为什么 [].all?{|a| a.包括? ('_' )} 返回真?

algorithm - 霍夫曼解码算法的运行时间和空间复杂度是多少?

php - 如何在 TIC-Tac-Toe 游戏 (X0) php 中使用 miniclip 算法