【问题标题】:Solving an Algorithmic Challenge involving Differences between Pairs解决涉及对之间差异的算法挑战
【发布时间】:2014-08-18 13:41:47
【问题描述】:

以下是我提出的一个算法问题,其动机是由一个我无法解决的更难的问题推动的。不幸的是,我也无法解决这个问题。

按递增顺序给您 n 个数字(n 介于 1 和 3*10^5 之间,因此需要线性运行时间)。每个数字的范围也从 1 到 3*10^5。对于从 1 到 3*10^5 的每个数字,将其表示为 z,您想找出有多少对数字具有 z 的成对差异。请阅读下面的示例以获得更清晰的信息。

数字:1,6,9
答:1对相差5(1,6),1对相差3(6,9),1对相差8(1,9)

数字:1,2,3,4
答:3对相差1(1,2 2,3 3,4),2对相差2(1,3 2,4),1对相差3(1,4) .

有没有一种数据结构可以用来在线性时间内解决这个问题?

【问题讨论】:

  • 你确定这比其他问题更容易吗?
  • 数字不同?出现一次后可以重复吗?
  • 不,很遗憾我不确定。这是另一个问题:codeforces.com/contest/386/problem/C
  • 是的,它们是不同的
  • @user3904846 另一个问题实际上要容易得多。

标签: c++ algorithm data-structures


【解决方案1】:

这是一个 O(n polylog n) 时间算法来计算所有 z 的计数(假设我们最多有 n 个介于 1 和 n 之间的数字)。

准备两个多项式 P(x) = sum_{d in the list} x^d 和 Q(x) = sum_{d in the list} x^(n - d)。使用快速乘法算法计算多项式乘积 P(x) Q(x) 的系数。要查找 z 的答案,请检查 x^(n + z) 的系数,即

sum_{d in the list} sum_{e in the list} [d + n - e = n + z],

其中 [d + n - e = n + z] = [d - e = z] 如果 d - e = z 为 1,否则为 0。

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 2022-01-02
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多