序列变更查询

时间:2019-01-26 14:08:49

标签: sorting segment segment-tree

您好,我需要以下问题的帮助

v是长度为k的序列。第一步,我们可以选择索引i,并将值v_i更改为(v_i)-1或更改为(v_i)+ 1。 我们有f(v_1,v_2,...,v_k),这是满足v_1 <= v_2 <= ... <= v_k的最小步骤数。

我们得到了长度为n的数组s。

我们需要回答q个独立的查询。对于每个查询,我们都给定值a和b,我们应该返回f(s_l,s_ {l + 1},...,s_r)的值,其中

l =(((a + last-1)mod n)+1和r =((b + last-1)mod n)+1并且last是前一个查询的答案。对于第一个查询,l = a,r = b

1 <= n <= 100000

1 <= q <= 100000

1 <= s_i <= 32

我的想法是使用优先级队列以O((rl)log(rl))的时间来计算f(s_l,s_ {l + 1},...,s_r),但是这样做会很慢O(qn logn)时间的时间复杂度。 有人可以帮助我,告诉我更有效的方法吗?

0 个答案:

没有答案