沿着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.
你能帮忙建议一些算法来解决这个问题。我曾考虑使用某种优先级队列或堆栈数据结构,但我真的不确定如何继续。
谢谢,托德
答案 0 :(得分:0)
创建几乎线性时间算法并不困难,因为最近在CodeChef上讨论了类似的问题:"ABC-Strings"。
L
计数器包含在当前子集中包含的类型中,从其他L-1
计数器中减去第一个计数器,这会产生L-1
个值。将剩余的8-L
个计数器与这些L-1
值组合在一起,形成7个值的元组。