Codeforces #619 & #620 反思

文章目录

      • 背景
      • CF #619 div.2
        • 赛时状态
        • 题目&题解
        • 反思
      • CF #620 div.2
        • 赛时状态
        • 题目&题解
        • 反思

背景

在这里插入图片描述

CF #619 div.2

赛时状态

开考没有被卡,A 和 B 都过的很快,状态还不错。

C 对我来说就是雷击,一道数学题,卡了巨久,期间想过各种各样的方式来推导,就是没有想过通过移动把相邻两个区间的变化看作二次函数。

C 做不出来,我就看 D,D 是一个构造题,我先推出来欧拉回路一定存在,然后作出了一个错误决定:码一个欧拉回路测试小数据,构造最终方案的通性。最终我找到了一个极麻烦的方法,细节很多以至于整场都没调完,极限状况下甚至是错的。。。然而赛后发现,再观察一下下图就有一个 simple 的通解。。。

E 和 F 都没看。事实证明 E 是一个比较简单的题。。。

题目&题解

A 与 B 过水不讲。

C 题面:

有一个长度为 n n n 的 01 串,已知其中有 k k k 个 1,问对于所有 01 串,最大的含 1 子串个数为多少。

1 ≤ k ≤ n ≤ 1 0 9 1\leq k \leq n \leq 10^9 1kn109

C 题解:

含 1 子串最多不好计算,不如计算全 0 子串最少。

这样的话,将整个 01 串用 1 劈开,每段连续的 0 会产生 l e n 2 len^2 len2 个全 0 子串。

我们可以视作相邻两段全 0 子串中间间隔的 1 可以“移动”。

那么,令相邻两全 0 子串长度和为 x x x,最优必然是分成两段 x / 2 x/2 x/2

综上,我们可以得出,最优串的 0 连续段长度必然是 l l l l + 1 l+1 l+1 两种。

答案就容易构造了。复杂度 O ( 1 ) O(1) O(1)

D 题面:

有一个 n ∗ m n * m nm 的格阵,相邻两格之间有两条方向相反的单向边。问是否存在一种方案,能从 ( 1 , 1 ) (1,1) (1,1) 出发,走 k k k 条边,且不重复走同一条边。如果有,则构造一种方案。方案应由不多于 3000 3000 3000 个操作组成,每个操作为:给定一个数 x x x 表示重复次数,长度 ≤ 4 \leq 4 4 的字符串表示动向。

n , m ≤ 500 n,m \leq 500 n,m500 k ≤ 1 0 9 k \leq 10^9 k109

D 题解:

可以发现每个点度数均是偶数,我们有理由相信存在欧拉回路。

所以不存在方案当且仅当 k k k 大于边数。

然后我们考虑怎么构造。

经过摸索可以得到一个 simple 的方案:

  1. 先把第一行来回走完。
  2. 向下一步走到第二行,向右走,每走一格就上下一次,然后向右继续。
  3. 走完以后,向左一路回到第一列,然后重复 2,3 直到最后一行。
  4. 在走完最后一行后,一路向上回到 ( 1 , 1 ) (1,1) (1,1)

容易发现如此构造必然是欧拉回路,且操作数在要求范围内。

注意每一步,如果走完了 k k k ,则要特判。

时间复杂度 O ( n + m ) O(n+m) O(n+m)

E 题面:

给定一个 n ∗ m n * m nm 的格阵,每个格有颜色。

一个 nanosoft \texttt{nanosoft} nanosoft 定义为一个长为 2 2 2 的倍数的正方形,且能沿两条中线被切成四块正方形,左上角颜色均为 R,右上角为 G,右下角为 B,左下角为 Y。

q q q 次询问,每次给定一个原格阵的子阵,问子阵内最大的 nanosoft \texttt{nanosoft} nanosoft 格数。

n , m ≤ 500 n,m \leq 500 n,m500 q ≤ 3 ∗ 1 0 5 q \leq 3 * 10^5 q3105

E 题解:

先用 O ( n 2 ) O(n^2) O(n2) 的经典做法求出以每个点为左上角正方形的右下角的最大 nanosoft \texttt{nanosoft} nanosoft。然后用二维 ST 表预处理二维最大值。

对于每个询问,我们二分答案,然后根据答案将待查询矩阵缩小一圈,排除必然不合法的情况。然后在剩下的矩阵内用 ST 表查询,得到的值作为判据即可。

时间复杂度 O ( n m log ⁡ n log ⁡ m + q log ⁡ n m ) O(nm \log n \log m + q \log nm) O(nmlognlogm+qlognm)

F 没看。。。

反思

为什么做不出实际很简单的题呢?

最终的结论是:数学功底不足,参赛经验还是不够。

CF #620 div.2

赛时状态

A,B,C 都是秒了。本以为这么顺成绩应该挺好的,结果就止步于此了。。。

看 D 刹那间没什么头绪,所以去看了 E。结果这一去不复返。。。

看 E,弱智地以为要分类讨论一大堆,于是就写了个树剖然后狂分,最后除了 -4 以外一无所获,pretest 8 成为过不去的坎。。。

最后回来看 D,又脑子抽风,没迸出灵感。就滚蛋了。

F1,F2 根本没动。事实证明这是最愚蠢的决定,因为这是我比较擅长的 dp。

题目&题解

A,B,C 过水不讲。

D 题面:

一个 1 1 1 ~ n n n 的排列,给定一个长度为 n − 1 n-1 n1 < < < > > > 组成的字符串确定相邻元素的大小关系。给出两种构造排列的方案,使得其 LIS 长度最小/最大。

n ≤ 2 ∗ 1 0 5 n \leq 2 * 10^5 n2105

D 题解:

对于 LIS 最小,考虑每个连续的 < < < 段。最小的 LIS 长度必然大于等于最长的连续 < < < 段长度 +1。然后我们要构造一种方案,使得它取等。

从前到后,优先往每个段里面放大数即可。容易发现一旦如此构造,那么对于任意一段 < < < 段的末尾,其之后均不会有大于它的值,也就达到了最小。

对于 LIS 最大,考虑每个连续的 > > > 段。对于每段,必然只有最多一个数被选入 LIS。我们可以构造一种方案使得每段都有被选入 LIS 里的数,这样就能达到最大。

从前到后,优先往每个段里面放小数即可。容易发现一旦如此构造,那么下一段必然能取出一个比当前 LIS 末尾更大的数。这样每段都会有被选入 LIS 的数。

时间复杂度 O ( n ) O(n) O(n)

E 题面:

一棵有 n n n 个点的树,有 q q q 次询问,每次加一条边,然后询问一个点到另一个点是否存在经过恰 k k k 条边的路径。(可以重复经过点与边)

n , q ≤ 1 0 5 n,q \leq 10^5 n,q105 k ≤ 1 0 9 k \leq 10^9 k109

E 题解:

分类讨论是否经过新加的边,共有 3 种情况。此处设加的边为 a a a ~ b b b,询问 x x x ~ y y y

那么有 3 种可能路径: x x x ~ y y y x x x ~ a + b a + b a+b ~ y + 1 y + 1 y+1 x x x ~ b + a b + a b+a ~ y + 1 y + 1 y+1。这 3 种路径包含了所有可能的路径种类。

考虑如果一条路径长度 ≤ k \leq k k 且与 k k k 奇偶性相同,那么必然可以。

所以逐个验证 3 条路径就好了。倍增 LCA 时间复杂度 O ( n log ⁡ n + q log ⁡ n ) O(n\log n + q\log n) O(nlogn+qlogn)

F 咕咕咕

反思

考场上不能一根筋死磕,并且要灵活转化,利用简化的思想去分类,而不是有啥来啥,按题意去钻牛角尖。

另外,也证明我思维强度还不够,没有看出来 D 的构造。。。还要加强思维。

你可能感兴趣的:(OI,反思)