CF306B Optimizer
题目描述
一个进程的 RAM 是一个由字节组成的序列,索引从 1 到 $n$。Polycarpus 的程序中包含诸如 “memset” 这样的指令,即将某一段内存单元填充为某一值的操作。具体而言,代码中只有 $m$ 条如下格式的指令:“set13 $a_i$ $l_i$”。第 $i$ 条指令将一段长度为 $l_i$、从第 $a_i$ 个单元开始的连续内存区间(即编号为 $a_i, a_i+1, ..., a_i+l_i-1$ 的单元)全部填充为 13。
在 Polycarpus 的代码中,优化器的任务是尽量多地删除指令,但要保证剩下的指令仍然能够在所有应被赋值为 13 的字节上正确地写入 13,并且仅赋值在本应被写入 13 的字节上。你的任务是为这样的程序实现一个优化器。
输入格式
第一行包含两个整数 $n$ 和 $m$($1 \leq n \leq 2 \cdot 10^{6}, 1 \leq m \leq 2 \cdot 10^5$),分别表示字节(内存单元)数量和 Polycarpus 代码中的指令数量。接下来 $m$ 行,每行包含一对整数 $a_i, l_i$($1 \leq a_i \leq n, 1 \leq l_i \leq n - a_i + 1$)。
输出格式
第一行输出最多能删除的指令数量。第二行输出这些指令的编号,指令按照输入顺序从 1 到 $m$ 编号。如果有多组方案,输出任意一组即可。
说明/提示
由 ChatGPT 5 翻译