0%

Codeforces Round 1083 (Div. 2)——CF-2205-F. Simons and Reconstructing His Roads(遇到一道题目没有思路,可以先降低约束试一试)(+-+-,需要想到差分)(对割的理解以及使用)(格林公式的应用)

题目大意

题目大意

给定一个 n×mn \times m 的网格图,包含交汇点 (1,1)(1,1)(n,m)(n,m)。网格中的相邻交汇点之间存在道路:

  • (i,j)(i,j)(i+1,j)(i+1,j) 之间为垂直道路,其权值为 wi,jw_{i,j}

  • (i,j)(i,j)(i,j+1)(i,j+1) 之间为水平道路,其权值为 vi,jv_{i,j}

由于一些事故,部分道路无法被重建(由输入状态 00 表示),其余道路可选择是否重建(由输入状态 11 表示)。

对于网格中的任意一个交汇点,如果与其相连且最终被重建的道路数量为偶数,则称该交汇点是“优雅的”。
如果所有的交汇点都是“优雅的”,则称当前的整个道路重建方案是“完美的”。

美丽值计算方式

对于一个“完美的”重建方案,其“美丽值”的计算方式如下:

  1. 初始美丽值为 00

  2. 对于每一行 ii (1in11 \le i \le n-1),找出所有在这一行向下延伸(即连接 (i,j)(i,j)(i+1,j)(i+1,j))且被重建的垂直道路。设它们所在的列号从小到大依次为 c1<c2<c3<c_1 < c_2 < c_3 < \dots,则将 wi,c1wi,c2+wi,c3wi,c4+w_{i,c_1} - w_{i,c_2} + w_{i,c_3} - w_{i,c_4} + \dots 累加到美丽值中。

  3. 对于每一列 jj (1jm11 \le j \le m-1),找出所有在这一列向右延伸(即连接 (i,j)(i,j)(i,j+1)(i,j+1))且被重建的水平道路。设它们所在的行号从小到大依次为 r1<r2<r3<r_1 < r_2 < r_3 < \dots,则将 vr1,jvr2,j+vr3,jvr4,j+v_{r_1,j} - v_{r_2,j} + v_{r_3,j} - v_{r_4,j} + \dots 累加到美丽值中。
    (简单来说,就是分别对“每行向下的重建道路”和“每列向右的重建道路”按坐标顺序交替加减其权值)

目标:在所有“完美的”重建方案中,求出最大的“美丽值”。

image

输入格式

  • 第一行包含测试用例数 tt (1t51041 \le t \le 5 \cdot 10^4)。

  • 每个测试用例的第一行包含 nnmm (2n,m2105,nm41052 \le n, m \le 2 \cdot 10^5, \sum n \cdot m \le 4 \cdot 10^5)。

  • 接下来 n1n-1 行,每行 mm 个整数,表示垂直道路的权值 wi,jw_{i,j}

  • 接下来 nn 行,每行 m1m-1 个整数,表示水平道路的权值 vi,jv_{i,j}

  • 接下来 n1n-1 行,每行一个长度为 mm 的 01 字符串,表示各条垂直道路是否可以被重建。

  • 接下来 nn 行,每行一个长度为 m1m-1 的 01 字符串,表示各条水平道路是否可以被重建。

输出格式

对于每个测试用例,输出一个整数,表示在所有完美重建方案中能获得的最大美丽值。

样例数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
4
3 4
2 3 -2 3
4 9 4 -4
3 4 -2
-9 -5 1
6 -1 -3
1111
1111
111
111
111
2 4
4 23 1 35
6 12 -17
-14 1 -40
0100
000
101
3 3
1 0 1
0 1 0
1 0
0 1
0 0
110
111
10
11
11
3 4
13 7 6 -12
3 -5 12 -6
-3 10 -15
-5 8 -11
10 0 -5
1111
0110
110
101
010

样例解释

以第一个测试用例为例(n=3,m=4n=3, m=4,且所有道路均允许重建),在使得所有交汇点相连重建道路数均为偶数的前提下,取得最大美丽值的方案如下:

垂直道路(向下的边)的选择

  • 第 1 行向下重建位于列 1、列 3 的道路,权值分别为 2,22, -2,贡献值为:2(2)2 - (-2)

  • 第 2 行向下重建位于列 2、列 4 的道路,权值分别为 9,49, -4,贡献值为:9(4)9 - (-4)

水平道路(向右的边)的选择

  • 第 1 列向右重建位于行 1、行 2 的道路,权值分别为 3,93, -9,贡献值为:3(9)3 - (-9)

  • 第 2 列向右重建位于行 1、行 3 的道路,权值分别为 4,14, -1,贡献值为:4(1)4 - (-1)

  • 第 3 列向右重建位于行 2、行 3 的道路,权值分别为 1,31, -3,贡献值为:1(3)1 - (-3)

该方案不仅满足所有交汇点度数皆为偶数,且其总美丽值为:
(2(2))+(9(4))+(3(9))+(4(1))+(1(3))(2 - (-2)) + (9 - (-4)) + (3 - (-9)) + (4 - (-1)) + (1 - (-3))
=4+13+12+5+4=38= 4 + 13 + 12 + 5 + 4 = 38

在第二个测试用例中,受限于无法重建的道路限制,唯一的完美重建方案是“不重建任何道路”,因此最大美丽值为 00

思路讲解

像这道题目,对于重建的这个约束太多。

Consider the case without any “accidents”, i.e., when there are no additional restrictions on the reconstructed streets.

我们可以先把所有对于重建边操作的限制,就是有一些边不能进行重建操作,给删除,我们会做了吗?(注意这里不能够把这个偶数条边的这个结果也给删了)

其实也没有那么简单,你首先要注意到,对于一维问题,成对的±,相当于一系列差分的和。那么,还需要特意去选吗?直接选全部为正的差分值不就好了?(连续选了两个或更多差分值,有重叠也没关系,可以使用我们下图的逆运算)

image

但是这个只能解决成对的 ± 问题呀,要是 ±+,以 + 结尾的不成对串如何解决呢?

来,我们仔细看看。只需要在末尾加一个 0,然后采用同样的贪心即可。

image

好,下面我们要正式解决这个问题了。

问题来到了 2D,我们发现有一个这个约束,就是,点的偶数边重建约束,这个还是有点烦的,怎么样去解决这个问题?

不难想到,如果一个点的边是否重建受到约束,我们能不能找到一个东西,其无论怎么样取,都符合约束呢?这样无论是贪心还是 dp,都会好解决的多。

Codeforces Round 1026 (Div. 2)-CF-1026-E. Melody

Codeforces Round 1081 (Div. 2)-CF-1081-E. Swap to Rearrange(按值进行图论建模)(欧拉回路)

通过这些题目,我们知道,如果说所有的点的度数都是偶数,组成的一定是一个欧拉回路(在无向联通图中)。

那么在这道题目中,题目所给我们的图,实际上是一个对偶图(就是边不相交的平面图,显然,网格图是对偶图),欧拉回路在对偶图中,实际上是一个割(这个是不难得出的,说白了,你在平面上一笔画出一条回路,当然能把平面划分为两部分,特别还要求你的这个路径是不会自相交的,因为所有边都互不相交)。注意,可以确定的是,这些欧拉回路

那既然是一个割,把一个面分割成了两部分,我们就想到了黑白染色

这个时候求解为什么能想到小的单位面元?从更高的观点来看,其实这个是离散型二维格林公式

image

具体而言,如下图所示:

image

现在问题在于如何处理这个有些边不能进行重建操作?

image

那么上图已经讲的很清楚了,不能重建的边,就像是胶水,直接把这两块给粘起来,这条边就不会再操作了。唯一一个特殊点就是最边上的边就是和外部联通了,这里我们需要设置一个外部节点 out_node,把他和 out 连接在一起即可。

AC代码

AC
https://codeforces.com/contest/2205/submission/365321534

心路历程(WA,TLE,MLE……)

哎,非常经典的错误啊

在并查集中,直接改动节点的值是非常幼稚的,因为你不知道他是不是根节点,当然你可以 find 后改根节点。

image

AC

https://codeforces.com/contest/2205/submission/365204709

AI 代码确实是没什么问题。