CF1119G Get Ready for the Battle

题目描述

最近,Evlampy 安装了一款有趣的电脑游戏,其中一个玩法是将军队分成若干小组,然后与敌人的小组作战。我们来考虑这个战斗的简化版本。 在即将到来的战斗中,Evlampy 需要对抗由 $m$ 个小组组成的敌军,第 $i$ 个小组拥有 $hp_i$ 点生命值。 Evlampy 的军队由 $n$ 名相同的士兵组成。在每场战斗前,他需要将自己的军队恰好分成 $m$ 个小组(可以有空组),使得所有小组的总人数为 $n$。战斗按回合进行。在每一回合中,Evlampy 的每个小组会攻击恰好一个敌方小组。因此,每一回合可以用一个长度为 $m$ 的数组 $a_1, a_2, \ldots, a_m$ 来描述,表示第 $i$ 个 Evlampy 的小组攻击第 $a_i$ 个敌方小组。不同的小组可以攻击同一个敌方小组,每一回合可以独立选择数组 $a$。 每一回合后,每个敌方小组的生命值会减少本回合中所有攻击该小组的 Evlampy 小组的士兵总数。当某个敌方小组的生命值降至 $0$ 或更低时,该小组被摧毁。Evlampy 的士兵不会损失生命值。 Evlampy 意识到即将到来的战斗将持续整晚,这让他很沮丧,因为这样他就没有时间完成作业了。现在,Evlampy 希望你编写一个程序,帮助他用最少的回合赢得战斗。你能帮帮他吗? 换句话说,请你找出摧毁所有敌方小组所需的最少回合数,并给出一种可行的方案。你需要给出军队分组的方法,以及每一回合的攻击数组 $a$。

输入格式

第一行包含两个整数 $n$ 和 $m$($1 \leq m \leq n \leq 10^{6}$),分别表示 Evlampy 军队中的士兵数和敌军中的小组数。$m$ 也是 Evlampy 可以分组的最大组数。 第二行包含 $m$ 个整数 $hp_1, hp_2, \ldots, hp_m$($1 \leq hp_i \leq 10^{6}$),表示每个敌方小组的生命值。 保证所有 $hp_i$ 的和不超过 $10^{6}$。

输出格式

输出一个整数 $t$,表示赢得战斗所需的最少回合数。 接下来一行输出 $m$ 个整数 $s_1, s_2, \ldots, s_m$($s_i \ge 0$,$s_1 + s_2 + \ldots + s_m = n$),表示 Evlampy 的第 $i$ 个小组应包含的士兵数。 接下来的 $t$ 行,每行输出 $m$ 个整数 $a_1, a_2, \ldots, a_m$($1 \le a_i \le m$),描述每一回合的攻击方案。每个整数表示本回合中第 $i$ 个 Evlampy 的小组攻击第 $a_i$ 个敌方小组。允许攻击已经被摧毁的敌方小组。

说明/提示

第一个样例如下图所示。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1119G/83b26697e1512ab6ed6ffa18c7896b3d481f3fad.png) 由 ChatGPT 4.1 翻译