开考没有被卡,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 1≤k≤n≤109
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 n∗m 的格阵,相邻两格之间有两条方向相反的单向边。问是否存在一种方案,能从 ( 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,m≤500, k ≤ 1 0 9 k \leq 10^9 k≤109
D 题解:
可以发现每个点度数均是偶数,我们有理由相信存在欧拉回路。
所以不存在方案当且仅当 k k k 大于边数。
然后我们考虑怎么构造。
经过摸索可以得到一个 simple 的方案:
容易发现如此构造必然是欧拉回路,且操作数在要求范围内。
注意每一步,如果走完了 k k k ,则要特判。
时间复杂度 O ( n + m ) O(n+m) O(n+m)。
E 题面:
给定一个 n ∗ m n * m n∗m 的格阵,每个格有颜色。
一个 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,m≤500, q ≤ 3 ∗ 1 0 5 q \leq 3 * 10^5 q≤3∗105。
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 没看。。。
为什么做不出实际很简单的题呢?
最终的结论是:数学功底不足,参赛经验还是不够。
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 n−1 由 < < < 和 > > > 组成的字符串确定相邻元素的大小关系。给出两种构造排列的方案,使得其 LIS 长度最小/最大。
n ≤ 2 ∗ 1 0 5 n \leq 2 * 10^5 n≤2∗105
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,q≤105, k ≤ 1 0 9 k \leq 10^9 k≤109
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 的构造。。。还要加强思维。