CF2009G2.Yunli's Subarray Queries (hard version)

提高+/省选-

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

这是问题的困难版本。在此版本中,保证所有查询的 r≥l+k−1r\geq l+k-1。

对于任意数组 bb,Yunli 可以执行以下操作任意次数:

  • 选择一个索引 ii。设置 bi=xb_i=x,其中 xx 是她想要的任何整数(xx 不限于区间 [1,n][1,n])。

将 f(b)f(b) 表示为她需要执行的最小操作数,直到 bb 中存在长度至少为 kk 的连续子数组*^{\text{*}}。

Yunli 收到一个大小为 nn 的数组 aa,并询问 qq 次。在每次查询中,你需要计算 ∑j=l+k−1rf([al,al+1,…,aj])\sum_{j=l+k-1}^{r}f([a_l,a_{l+1},\ldots,a_j])。

*^{\text{*}} 如果存在一个长度为 kk 的连续子数组,从索引 ii 开始(1≤i≤∣b∣−k+11\leq i\leq |b|-k+1),那么对于所有 i<j≤i+k−1i<j\leq i+k-1,bj=bj−1+1b_j=b_{j-1}+1。

输入格式

第一行包含 tt(1≤t≤1041\leq t\leq 10^4)——测试用例的数量。

每个测试用例的第一行包含三个整数 nn、kk 和 qq(1≤k≤n≤2⋅1051\leq k\leq n\leq 2\cdot 10^5,1≤2⋅1051\leq 2 \cdot 10^ 5)——数组的长度、连续子数组的长度和查询次数。

下一行包含 nn 个整数 a1,a2,…,ana_1,a_2,\ldots,a_n(1≤ai≤n1\leq a_i\leq n)。

以下 qq 行包含两个整数 ll 和 rr(1≤l≤r≤n1\leq l\leq r\leq n,r≥l+k−1r\geq l+k-1)——查询的边界。

保证所有测试用例中 nn 的总和不超过 2⋅1052\cdot 10^5,所有测试用例的 qq 总和不超过 2⋅1052\cdot 10^5。

输出格式

对于每组测试数据上的每次查询,输出 ∑j=l+k−1rf([al,al+1,…,aj])\sum_{j=l+k-1}^{r}f([a_l,a_{l+1},\ldots,a_j])。

输入输出样例

  • 输入#1

    3
    7 5 3
    1 2 3 2 1 2 3
    1 7
    2 7
    3 7
    8 4 2
    4 3 1 1 2 4 3 2
    3 6
    1 5
    5 4 2
    4 5 1 2 3
    1 4
    1 5

    输出#1

    6
    5
    2
    2
    5
    2
    3

说明/提示

在第一组测试用例的第二次查询中,我们计算了以下函数值:

  • f([2,3,2,1,2])=3f([2,3,2,1,2])=3,因为 Yunli 可以设置 b3=4b_3=4、b4=5b_4=5 和 b5=6b_5=6,从而在 33 次操作中形成一个大小为 55 的连续子阵列。
  • f([2,3,2,1,2,3])=2f([2,3,2,1,2,3])=2,因为我们可以设置 b3=0b_3=0 和 b2=−1b_2=-1,在 22 次操作中中(从位置 22 开始)形成一个大小为55的连续子阵列。

这个查询的答案是 3+2=53+2=5。

翻译 @Cure_Wing。

输入解题思路,AI测评打分。不知道怎么写?

首页