CF1998E2.Eliminating Balls With Merging (Hard Version)
省选/NOI-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
喝水。
—— 孙武,《成为一名健康程序员的艺术》
这是这个问题的更难的版本。唯一的区别是在这个版本中 x=1。你必须破解这两个版本才能破解。
你被给定了两个整数 n 和 x ( x=1 ),有 n 个球排成一排,从左到右从 1 到 n 编号。最初,在第 i 个球上写了一个值 ai。
对于从 1 到 n 的每一个整数 i,我们定义函数 f(i) 如下:
- 假设你有一个集合 S={1,2,…,i}。
- 对于每一次操作,你需要从 S 中选择出一个整数 l (1≤l<i),使得 l 不是 S 中的最大元素。假设 r 是 S 中比 l 大的最小元素。
- 如果 al>ar,你把 al 赋值为 al+ar,然后将 r 从 S 中移除
- 如果 al<ar,你把 ar 赋值为 al+ar,然后将 l 从 S 中移除
- 如果 al=ar,你可以在 l 和 r 任意选一个移出 S:
- 如果 你选择把 l 从 S 中移除,你需要 ar 赋值为 al+ar,然后将 l 从 S 中移除。
- 如果 你选择把 r 从 S 中移除,你需要 al 赋值为 al+ar,然后将 r 从 S 中移除。
- f(i) 表示整数 j (1≤j≤i) 的个数,使得在执行上述运算 i−1 次后可以得到 S={j}。
对于每一个整数 i 从 x 到 n,你需要找到 f(i)。
输入格式
第一行包含一个整数 t (1≤t≤104),也就是测试组数。
每一组测试数据的第一行包含两个整数 n 和 x (1≤n≤2⋅105;x=1),也就是球的数量和最小的索引 i 你需要找到 f(i)。
每一组测试数据的第二行包含 n 个整数 a1,a2,...,an (1≤ai≤109),也就是每个球上写的数字。
保证所有测试数据中的 n 之和小于等于 2⋅105。
输出格式
对于每一组测试数据,在新的一行中输出 n−x+1 个用一个空格隔开的整数,其中第 j 个数应当表示 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
说明/提示
对于第一组数据,下面是对于每个 1 到 n 的 i,j 可以取到的所有数值:
- 对于 f(1),j 只能取 1。
- 对于 f(2),j 只能取 2。
- 对于 f(3),j 能取 2 和 3。
- 对于 f(4),j 能取 2 和 3。
- 对于 f(5),j 能取 2,3 和 4。
输入解题思路,AI测评打分。不知道怎么写?