CF625E Frog Fights

题目描述

Ostap Bender 最近参观了青蛙农场,受到启发想创造自己的青蛙游戏。 有若干只青蛙被放置在一个分成 $m$ 个格子的环形游戏盘上。格子编号从 $1$ 到 $m$,但由于是环形棋盘,第 $1$ 格位于第 $m$ 格的后面。第 $i$ 只青蛙在轮到它的时候可以向前跳 $a_{i}$ 个格子。 青蛙们轮流移动,游戏从第 $1$ 只青蛙开始。每当轮到第 $i$ 只青蛙时,它会向前跳 $a_{i}$ 个格子,将跳跃路径上的所有青蛙击出棋盘。如果最后一格上有青蛙,该青蛙也会被击出。然后,将 $a_{i}$ 的值减去本次被它击出的青蛙数量。如果 $a_{i}$ 变为 $0$ 或负数,该青蛙将不再行动。 当第 $1$ 只青蛙完成行动后,轮到第 $2$ 只青蛙,以此类推。当第 $n$ 只青蛙行动后,又轮到第 $1$ 只青蛙,然后第 $2$ 只,如此循环不息。如果某只青蛙已经被击出棋盘,则其之后的所有回合都被跳过。 请你帮助 Ostap 判断,最后会有哪些青蛙还在棋盘上?

输入格式

第一行包含两个整数 $n$ 和 $m$($1 \leq n \leq 100000, 1 \leq m \leq 10^{9}, n \leq m$)——青蛙的数量和棋盘的格子数。 接下来的 $n$ 行,每行包含两个整数 $p_{i}$ 和 $a_{i}$($1 \leq p_{i}, a_{i} \leq m$),分别为第 $i$ 只青蛙初始所在的格子编号和初始跳跃距离。保证所有 $p_{i}$ 两两不同。

输出格式

第一行输出棋盘上最后剩余的青蛙数量。 第二行输出这些青蛙的编号(可按任意顺序)。

说明/提示

在第一个样例中,第一只青蛙跳了 $1$ 格,落在第 $3$ 格。第二只青蛙跳了 $3$ 格,落在第 $3$ 格,把第一只青蛙击出。此时第二只青蛙的跳跃距离变成 $2$。第三只青蛙跳到第 $2$ 格,然后第二只青蛙跳到第 $5$ 格。第三只青蛙随后跳到第 $5$ 格,把第二只青蛙也击出了。现在仅剩下第三只青蛙。 在第二个样例中,第一只青蛙跳了 $2$ 格,把第 $2$ 格和第 $3$ 格的青蛙都击出。此时它的 $a_{i}$ 变成 $0$。然后第四只青蛙跳到第 $5$ 格,将第五只青蛙击出,自己的 $a_{i}$ 变成 $0$。这两只青蛙会永远留在棋盘上。 由 ChatGPT 5 翻译