确定最长的连续子序列

时间:2014-04-06 23:26:24

标签: algorithm sorting data-structures dynamic-programming greedy

沿着a有N个节点(1 <= N <= 100,000)各个位置 长一维长度。第i个节点位于x_i(an 整数,范围为0 ... 1,000,000,000),节点类型为b_i(整数in 范围1..8)。节点不能处于相同的位置

您希望在此一维上获得一个范围,其中所有类型的节点都得到公平表示。因此,您要确保对于范围中存在的任何类型的节点,每个节点类型的数量相等(例如,类型1和3各有27的范围是正确的,范围是27类型1,3和4是 好的,但是类型1中的9和类型3中的10不正常)。你也想要 至少K(K> = 2)类型(总共8个)中要表示的类型 兰特。找到满足约束条件的此范围的最大大小。照片的大小是照片中节点的最大和最小位置之间的差异。

如果没有满足约束的范围,则输出-1。

INPUT:

* Line 1: N and K separated by a space

* Lines 2..N+1: Each line contains a description of a node as two
        integers separated by a space; x(i) and its node type.

INPUT:

9 2  
1 1  
5 1  
6 1  
9 1  
100 1  
2 2  
7 2  
3 3  
8 3     

INPUT DETAILS:  
Node types: 1 2 3 - 1 1 2 3 1  - ...  -   1  
  Locations: 1 2 3 4 5 6 7 8 9 10 ... 99 100

OUTPUT:

* Line 1: A single integer indicating the maximum size of a fair
       range. If no such range exists, output -1.

OUTPUT:

6

OUTPUT DETAILS:

The range from x = 2 to x = 8 has 2 each of types 1, 2, and 3. The range
from x = 9 to x = 100 has 2 of type 1, but this is invalid because K = 2
and so you need at least 2 distinct types of nodes.

你能帮忙建议一些算法来解决这个问题。我曾考虑使用某种优先级队列或堆栈数据结构,但我真的不确定如何继续。

谢谢,托德

1 个答案:

答案 0 :(得分:0)

创建几乎线性时间算法并不困难,因为最近在CodeChef上讨论了类似的问题:"ABC-Strings"

  1. 按位置对节点排序。
  2. 准备所有可能的节点类型子集(例如,我们可以期望在结果区间中存在类型1,2,4,5,7以及那里不存在的所有其他类型)。对于K = 2,可能只有256-8-1 = 247个子集。对于每个子集执行剩余步骤:
  3. 将8个类型的计数器初始化为[0,0,0,0,0,0,0,0]。
  4. 对于每个节点执行剩余步骤:
  5. 当前节点类型的递增计数器。
  6. L计数器包含在当前子集中包含的类型中,从其他L-1计数器中减去第一个计数器,这会产生L-1个值。将剩余的8-L个计数器与这些L-1值组合在一起,形成7个值的元组。
  7. 使用此元组作为哈希映射的键。如果哈希映射不包含此键的值,请添加一个具有此键的新条目,其值等于当前节点的位置。否则,从当前节点的位置减去哈希映射中的值,并(可能)更新最佳结果。