例题计划

一天看十个题解思路和十个优秀代码,自己挑题目。尽量挑选自己的分数段的。
注明:(思路)/(代码)
时间:晚自习回来之后。可以适量思考。

2022.11.11

CF546E

【题意】
给定 \(n\)\(m\) 边无向图。第 \(i\) 个点有 \(a_i\) 个士兵,并且每个士兵可以选择留在原地或者前往与当前位置距离为 \(1\) 的点。求是否存在一个士兵迁移方式使得第 \(i\) 个点有 \(b_i\) 个兵。
\(n\le100,m\le200,a_i\le100,b_i\le100\)
【分析】
首先想到对每一条边设置元,跑高斯消元。但是有问题:这其中还包含了一些不等关系:每个点流出去的元的总和小于等于 \(a_i\)
考虑网络流。考虑 \(s\) 和每个点的入边连接一个流量为 \(a_i\) 的边,每个点的入边和它能到达的每一个点连接一个流量为 \(inf\) 的边,每个点的出边和 \(t\) 连接一个流量为 \(b_i\) 的边。然后跑最大流,是否合法看总流量是否等于 \(\sum a_i\)。方案看残量网络中反边容量也就是正边已经流的量。

CF713B

【题意】
有个 \(n \times n\) 的矩阵中有两个不相交的矩形。你可以进行不超过 \(200\) 次询问,每次询问划定一个矩形范围,然后系统会返回完全包含于这个矩形范围的矩形个数(\(0\)\(2\)),需要找出两个矩形在何处。
\(n \le 2^{16}\)
【分析】
先二分出两个矩形之间的边界,然后分别二分即可。每次独立的二分只需要 \(16\) 次,绰绰有余。

2022.11.12

ABC277F

【题意】
有个 \(n \times m\) 的矩阵,每个元素是 \(0\) 或某个正整数。可以进行若干次操作,每次把矩阵中两行交换,或者两列交换。需要使得最后的矩阵忽略 \(0\) 之后,对于每个元素按照其标号字典序排序之后是一个不降序列。
\(n \times m \le 10^6\)
【思想】
简化联通关系的建立。
【分析】
首先,转换操作。进行若干次操作之后,可以将行号排成任意排列,列号排成任意排列。例如:

\[\begin{bmatrix}1&2&3\\4&5&6\\7&8&9\\10&11&12\end{bmatrix} \]

可以将行号排成 \(\{2,3,1\}\),列号排成 \(\{2,1,4,3\}\),那么矩阵变成:

\[\begin{bmatrix}5&6&4\\2&3&1\\11&12&10\\8&9&7\end{bmatrix} \]

其次,分析怎样的矩阵满足条件。

  • 行内元素在 sort 之后是不会变化的。那么如果找到每一行最小和最大的非 \(0\) 元素,然后排序,如果某一行的最小元素小于上一行的最大元素,那么就不可以。
  • 每一行还要 sort。那么如果 \(a_{i,j} < a_{i,k}\),在列排列中 \(j<k\) 必须满足。如果出现冲突,那么就不可以。考虑用图维护这样的信息:对于 \(a_{i,j} < a_{i,k}\),连边 \(j \rightarrow k\)。那么只有当图为 DAG 时才是满足条件的。

这样,时间复杂度是 \(O(nw)\) 的。不能通过此题。考虑优化。

可以考虑到,如果 \(a < b < c\),那么不需要建立 \(a \rightarrow b,b \rightarrow c, c \rightarrow a\) 三条边,而是建立 \(a \rightarrow b \rightarrow c\) 即可。这样形成一条链,不管哪个后面的结点往前连边都是会出现环的。

但是有一个问题:如果出现一个块中有若干个相等的数,那么这些数均要和前后连边。注意到这个之后就好做了,这个就一个虚点,然后通过虚点建立联通关系。

posted @ 2022-11-10 19:02  OIer某罗  阅读(23)  评论(0编辑  收藏  举报