CF1998E2.Eliminating Balls With Merging (Hard Version)

省选/NOI-

通过率:0%

AC君温馨提醒

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

题目描述

喝水。
—— 孙武,《成为一名健康程序员的艺术》

这是这个问题的更难的版本。唯一的区别是在这个版本中 x=1x = 1。你必须破解这两个版本才能破解。

你被给定了两个整数 nn 和 xx ( x=1x = 1 ),有 nn 个球排成一排,从左到右从 11 到 nn 编号。最初,在第 ii 个球上写了一个值 aia_i。

对于从 11 到 nn 的每一个整数 ii,我们定义函数 f(i)f(i) 如下:

  • 假设你有一个集合 S={1,2,…,i}S = \{1, 2, \ldots, i\}。
  • 对于每一次操作,你需要从 SS 中选择出一个整数 ll (1≤l<i)(1 \le l < i),使得 ll 不是 SS 中的最大元素。假设 rr 是 SS 中比 ll 大的最小元素。
    • 如果 al>ara_l > a_r,你把 ala_l 赋值为 al+ara_l + a_r,然后将 rr 从 SS 中移除
    • 如果 al<ara_l < a_r,你把 ara_r 赋值为 al+ara_l + a_r,然后将 ll 从 SS 中移除
    • 如果 al=ara_l = a_r,你可以在 ll 和 rr 任意选一个移出 SS:
      • 如果 你选择把 ll 从 SS 中移除,你需要 ara_r 赋值为 al+ara_l + a_r,然后将 ll 从 SS 中移除。
      • 如果 你选择把 rr 从 SS 中移除,你需要 ala_l 赋值为 al+ara_l + a_r,然后将 rr 从 SS 中移除。
  • f(i)f(i) 表示整数 jj (1≤j≤i)(1 \le j \le i) 的个数,使得在执行上述运算 i−1i − 1 次后可以得到 S={j}S = \{ j \}。

对于每一个整数 ii 从 xx 到 nn,你需要找到 f(i)f(i)。

输入格式

第一行包含一个整数 tt (1≤t≤104)(1 ≤ t ≤ 10^4),也就是测试组数。

每一组测试数据的第一行包含两个整数 nn 和 xx (1≤n≤2⋅105;x=1)(1 ≤ n ≤ 2 \cdot 10^5;x = 1),也就是球的数量和最小的索引 ii 你需要找到 f(i)f(i)。

每一组测试数据的第二行包含 nn 个整数 a1,a2,...,ana_1,a_2,...,a_n (1≤ai≤109)(1 ≤ a_i ≤ 10^9),也就是每个球上写的数字。

保证所有测试数据中的 nn 之和小于等于 2⋅1052 \cdot 10^5。

输出格式

对于每一组测试数据,在新的一行中输出 n−x+1n - x + 1 个用一个空格隔开的整数,其中第 jj 个数应当表示 f(x+j−1)f(x + j - 1)。

输入输出样例

  • 输入#1

    3
    5 1
    1 2 3 2 1
    7 1
    4 5 1 2 1 4 5
    11 1
    1 2 3 1 1 9 3 2 4 1 3

    输出#1

    1 1 2 2 3
    1 1 1 1 1 3 4
    1 1 2 2 2 1 1 1 3 3 4

说明/提示

对于第一组数据,下面是对于每个 11 到 nn 的 ii,jj 可以取到的所有数值:

  • 对于 f(1)f(1),jj 只能取 11。
  • 对于 f(2)f(2),jj 只能取 22。
  • 对于 f(3)f(3),jj 能取 22 和 33。
  • 对于 f(4)f(4),jj 能取 22 和 33。
  • 对于 f(5)f(5),jj 能取 22,33 和 44。

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

首页