2017-04-09 96 views
0

给定N个数字列表(1索引),如果一个连续块具有多于K个连续出现的相同元素,则为K排序块。K排序的块范围查询

示例:[2,4,4,5,5,5,3,3]具有索引4至6的3阶块和7至8的2阶块。 4至6也是2阶块。

现在,如果我们给出形式查询:LeftIndex,RightIndex,令-K

我们需要LeftIndex和RightIndex之间要告诉很多订单-K块怎么都存在。

说,如果查询是2,8,2型,然后回答是3的3块与订单2.他们是从指数2至3,4至6,7至8

如何解决这个问题,如果查询高达100000,并且列表可以是100000.

+1

这个问题从跑步比赛中寻求解决方案(https://www.codechef.com/APRIL17/problems/SMARKET)。这个问题应该被删除。 – madMDT

回答

0

你应该显示你所做的和你的想法。请参阅tour

包括有关您尝试过的内容以及您正在尝试执行的操作的详细信息。

算法很简单。

i = leftIdx - 1开始一个循环,跳过并计算所有下一个等于list[i]的元素(使用while()循环)。如果相同元素的数量(包括list[i])大于或等于K,则会找到一个新的Order-K块。现在更新ii+count,并继续循环直至i > rightIdx

只是要小心与角落的情况下(空列表,右Idd < = leftIdx等)和IndexOutOfBound异常。

+0

但是在这种情况下,对于每个查询复杂度可以达到O(N)。这将是太多。有没有办法通过使用分段树等数据结构或进行一些预处理来降低每个查询的复杂度 – HackAround

+0

您说得对,查询速度太慢。我现在不知道如何做一个优雅的预处理。我会稍后再试。 @HackAround – Hac