Codeforces Round 802

E(总体观察,数学),F(贪心)

E

https://codeforces.com/contest/1700/problem/E

给你一个矩阵,每个数字都不相同

然后让你依次取1,2,3,4,… 取完所有

取的块需要和之前取过的至少一个4临

直接可取输出0

需要还是交换两个位置(可以不相邻)后可取,输出1 方案数

还是都不行输出2

范围

矩阵大小4e5

2s

256MB

题解

我的思路

0很好判断,vis染色+bfs

其实就是1的时候怎么算个数

不妨设按找上述方法最开始失败的是x

意味着, 小于x的连在一起了,

那么有两种方案

  1. 交换x和小于x的外边界,这样小于等于x就连在一起了,
  2. 交换小于x的某一个和x的四临

但是这两种如果一个一个检验是时间复杂度会炸掉的


考虑可交换的,对于第一种没有什么思路

对于第二种,你可以考察每个依赖于它的是否仅依赖于它, 但也不一定

1
2
3
4
145
2.6
3?7
.8.

比如上面这样,7仅依赖于6,而6也可以移动

不知道怎么搞了

题解

不要看一步一步,看总览性质

如果一个位置,它的四个邻居有比他小的,那么它就能连到小于它的数。矩阵为可遍历当且仅当所有点(除了1)的四个邻居都有比他小的。

这归纳法可证明


所以判断可行,也不再需要vis+bfs, 而直接判断count(badpos)== 0

所以badpos 需要交换它或者它的邻居

两两不相同,显然badpos不相邻, 因为badpos需要小于4临, 说明4临都不是badpos

两两不同,说明交换以后的两个位置,一个比原来大,一个比原来小,

比原来大的位置4邻之前一定不是badpos,

比原来小的本身一定不是badpos

综上, badpos最多5个, 一个中心一个4临

5x5x4, 种

代码

F

题目

https://codeforces.com/contest/1700/problem/F

2 * n 的01矩阵,两个

每次交换第一个中相邻位置的01,求最小次数得到第二个矩阵

范围

n 2e5

1s

256mb

题解

我的思路

写了个假的

两个变量记录未匹配的,然后进入则+,退出则-

发生 一正一负则消耗1抵消

竟然官方数据弱还过了system test

然后有错误样例

1
2
3
4
5
0 1 0
1 0 0

0 1 0
0 0 1

我的匹配会

1
2
3
4
5
0 b 0
a 0 0

0 a 0
0 0 b

代价为4, 最小的是2

官方

直接可配消耗掉即可…….

代码

总结

E

这个总体观察没想到, 一直在想细节的步, 总体只想到vis+bfs 而不是这个充分性质

jiangly 也TLE了好像

F

贪心细节还是没想到啊

参考

官方