#CSES2131. 网格拼图 II

网格拼图 II

题目背景

翻译自 CSES-2131 题。

题目描述

有一个 n×nn \times n 的网格,每个格子里有一定数量的金币。

你知道每一行和每一列需要选择多少个格子来获取金币。你可以从每个你选择的格子中获取所有金币。那么,如何选择这些格子才能使得你获得最大的金币数量,并且满足给定的条件?

输入格式

第一行包含一个整数 nn:网格的大小。行和列的编号为 1,2,...,n1, 2, ..., n

第二行包含 nn 个整数 a1,a2,...,ana_1, a_2, ..., a_n:表示你必须从第 ii 行选择 aia_i 个格子。

第三行包含 nn 个整数 b1,b2,...,bnb_1, b_2, ..., b_n:表示你必须从第 jj 列选择 bjb_j 个格子。

接下来有 nn 行,每行包含 nn 个整数 cijc_{ij}:表示第 ii 行第 jj 列格子里的金币数量。

你可以假设 a1+a2+...+ana_1 + a_2 + ... + a_nb1+b2+...+bnb_1 + b_2 + ... + b_n 相等。

输出格式

首先输出一个整数 kk:表示你可以收集到的最大金币数量。

然后输出 nn 行,每行描述你选择的格子。如果选择某个格子,则用 X 表示,否则用 . 表示。

如果无法满足条件,输出 -1

样例

5
0 1 3 2 0
1 2 2 0 1
2 5 1 5 1
0 2 5 1 2
3 8 9 3 5
1 4 3 7 3
0 3 6 2 8
32
.....
..X..
.XX.X
XX...
.....

说明/提示

1n501 \leq n \leq 50

0ain0 \leq a_i \leq n

0bjn0 \leq b_j \leq n

0cij10000 \leq c_{ij} \leq 1000