move(Easy Version)
题号:NC312376
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

\hspace{15pt}给定一个长为 n 宽为 m 的矩阵 a,其中矩阵中每个格子都有一个权值,第 i 行第 j 列的权值记为 a_{i,j},现在你能够执行以下两种操作之一:
\hspace{23pt}\bullet\,选择矩阵中某个位置 \left ( i,j \right ) \left ( 1\leqq i\leqq n;\, 1\leqq j<m \right ),令 u:=\left(a_{i,j}\operatorname{or} a_{i,(j+1)}\right)v:=\left(a_{i,j}\operatorname{and} a_{i,(j+1)}\right),使得 a_{i,j}:=ua_{i,(j+1)}:=v
\hspace{23pt}\bullet\,选择矩阵中某个位置 \left ( i,j \right ) \left ( 1\leqq i<n;\, 1\leqq j\leqq m \right ),令 u:=\left(a_{i,j}\operatorname{or} a_{(i+1),j}\right)v:=\left(a_{i,j}\operatorname{and} a_{(i+1),j}\right),使得 a_{i,j}:=ua_{(i+1),j}:=v

\hspace{15pt}随后,给定由列下标 1,2,\dots,m 中选取出的 k \left( 1\leqq k\leqq m \right) 个数构成的集合 \Bbb{A},记剩余 m-k 个数构成的集合为 \Bbb{B}你需要判断,是否能通过若干次上述操作(可以为零次),将矩阵 a 变成满足以下条件的新矩阵:
\hspace{23pt}\bullet\,对于任意的 j\in \Bbb{A}i\in[1,n],满足 a_{i,j}=1
\hspace{23pt}\bullet\,对于任意的 j\in \Bbb{B}i\in[1,n],满足 a_{i,j}=0
\hspace{15pt}如果可以做到,求出最少操作次数;否则直接输出 -1

【名词解释】
\hspace{15pt}\operatorname{or}:指位运算中的按位或(Bitwise OR),对两个整数的二进制表示按位进行或运算。
\hspace{15pt}\operatorname{and}:指位运算中的按位与(Bitwise AND),对两个整数的二进制表示按位进行与运算。

输入描述:

\hspace{15pt}第一行输入三个整数 n,m,k \left ( 1\leqq n, m \leqq 500;\, 1\leqq k\leqq m \right ),分别表示矩阵的长和宽以及集合 \Bbb{A} 的大小。
\hspace{15pt}第二行输入 k 个整数 \Bbb{A}_1, \Bbb{A}_2, \ldots, \Bbb{A}_k \left( 1\leqq \Bbb{A}_1 \lt \Bbb{A}_2 \lt \cdots \lt \Bbb{A}_k \leqq m \right),表示集合 \Bbb{A}
\hspace{15pt}此后 n 行,第 i 行输入 m 个整数 a_{i,1}, a_{i,2}, \ldots, a_{i,m} \left ( 0\leqq a_{i,j}\leqq 1 \right ),表示矩阵中第 i 行的权值。

输出描述:

\hspace{15pt}若矩阵 a 能通过上述操作(可以为零次)变成满足条件的新矩阵,输出最少操作次数;否则直接输出 -1
示例1

输入

复制
5 5 3
1 3 4
1 0 1 1 0
1 0 1 1 0
0 0 0 1 0
1 1 1 1 1
1 0 1 0 1

输出

复制
6
示例2

输入

复制
4 3 2
1 3
1 0 1
0 1 1
1 1 0
1 1 0

输出

复制
-1
示例3

输入

复制
3 8 2
2 5
0 0 1 0 0 1 0 0
0 0 1 0 0 1 0 0
0 0 1 0 0 1 0 0

输出

复制
6
示例4

输入

复制
2 4 2
2 3
1 1 0 0
0 0 1 1

输出

复制
-1

备注:

\hspace{15pt}在几乎全部的情况下,PyPy 的运行速度优于 Python,我们建议您选择对应版本的 PyPy 进行提交、而不是 Python。