CF1956E2 Nene vs. Monsters (Hard Version)
题目描述
这是该问题的困难版本。两个版本的唯一区别在于 $a_i$ 的约束条件。只有当你同时解决了两个版本的问题时,才能进行 Hack。
Nene 正在与 $n$ 个怪物战斗,这些怪物围成一个圆圈。这些怪物从 $1$ 到 $n$ 编号,第 $i$ 个怪物($1 \le i \le n$)当前的能量值为 $a_i$。
由于怪物们太强大,Nene 决定使用“攻击你的邻居”法术与它们战斗。当 Nene 施放这个法术时,依次发生以下操作:
- 第 $1$ 个怪物攻击第 $2$ 个怪物;
- 第 $2$ 个怪物攻击第 $3$ 个怪物;
- $\ldots$
- 第 $(n-1)$ 个怪物攻击第 $n$ 个怪物;
- 第 $n$ 个怪物攻击第 $1$ 个怪物。
当能量值为 $x$ 的怪物攻击能量值为 $y$ 的怪物时,被攻击怪物的能量值变为 $\max(0, y-x)$(攻击者的能量值仍为 $x$)。
Nene 计划将这个法术使用 $10^{100}$ 次,并亲自解决那些在此之后仍有非零能量的怪物。她希望你帮她确定,在施放上述法术 $10^{100}$ 次后,哪些怪物的能量值仍然不为零。
输入格式
每个测试包含多个测试用例。第一行包含测试用例数 $t$($1 \le t \le 10^4$)。接下来是每个测试用例的描述。
每个测试用例的第一行包含一个整数 $n$($2 \le n \le 2 \cdot 10^5$),表示怪物的数量。
第二行包含 $n$ 个整数 $a_1, a_2, \ldots, a_n$($0 \le a_i \le 10^9$),表示每个怪物当前的能量值。
保证所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^5$。
输出格式
对于每个测试用例:
- 第一行输出一个整数 $m$,表示在施放 $10^{100}$ 次法术后能量值仍不为零的怪物数量;
- 第二行输出 $m$ 个递增的整数 $i_1, i_2, \ldots, i_m$($1 \le i_1 < i_2 < \ldots < i_m \le n$),表示这些怪物的编号。
如果 $m=0$,你可以输出一个空行,也可以不输出这一行。
说明/提示
在第一个测试用例中,前 $3$ 次施放法术时发生如下操作:
- Nene 第一次施放“攻击你的邻居”法术;
- 第 $1$ 个怪物攻击第 $2$ 个怪物,攻击后第 $2$ 个怪物的能量变为 $\max(0, 5-2)=3$;
- 第 $2$ 个怪物攻击第 $3$ 个怪物,攻击后第 $3$ 个怪物的能量变为 $\max(0, 3-3)=0$;
- 第 $3$ 个怪物攻击第 $1$ 个怪物,攻击后第 $1$ 个怪物的能量变为 $\max(0, 2-0)=2$;
- Nene 第二次施放法术;
- 第 $1$ 个怪物攻击第 $2$ 个怪物,攻击后第 $2$ 个怪物的能量变为 $\max(0, 3-2)=1$;
- 第 $2$ 个怪物攻击第 $3$ 个怪物,攻击后第 $3$ 个怪物的能量变为 $\max(0, 0-1)=0$;
- 第 $3$ 个怪物攻击第 $1$ 个怪物,攻击后第 $1$ 个怪物的能量变为 $\max(0, 2-0)=2$;
- Nene 第三次施放法术;
- 第 $1$ 个怪物攻击第 $2$ 个怪物,攻击后第 $2$ 个怪物的能量变为 $\max(0, 1-2)=0$;
- 第 $2$ 个怪物攻击第 $3$ 个怪物,攻击后第 $3$ 个怪物的能量变为 $\max(0, 0-0)=0$;
- 第 $3$ 个怪物攻击第 $1$ 个怪物,攻击后第 $1$ 个怪物的能量变为 $\max(0, 2-0)=2$。
之后每次施放法术,怪物们的能量值都不会再变化。因此,最终只有第 $1$ 个怪物的能量值不为零。
在第二个测试用例中,两个怪物的初始能量值都为零。
由 ChatGPT 4.1 翻译