NOIP2024模拟赛21
省流:没过 T1,玩了 1h 俄罗斯,不好评价。
还好 T3 一个小时写完了平方暴力,还没菜到离谱,感觉这才是一个正常的分数。但是好像正解要不到 1h?
T2 的 dp 优化是我弱项,做不出正常,spdarkle 是真逆天。怎么一眼的怎么一眼的怎么一眼的怎么一眼的怎么一眼的怎么一眼的怎么一眼的。
发现后面又是一堆人,我怎么又没垫底。
算了天天好心情,把题补了再说。
T1 神经贪心。肯定要先尽可能匹配,然后你每次额外计算后面接一个小的花费。
T2 注意到最后点数是值域级别,显然不可做。注意到不存在跨越计数的情况,即:一定是所有相邻的两个 \(a_i\) 进行操作过后形成的所有数拼起来就可以组成最终的目标序列。
我们考虑把每一层拉出来进行转移。考虑把每相邻两个 \(a_i\) 之间的所有点单独考虑。分层过后是一个二叉树的形式:
实际上就是每次向右/右下走的最长路径。这个可以分层 dp 做了。(对于满的一层你肯定是最左到最右)
但是最后一层不是满的情况,非常不好做啊。发现性质:
-
若有一棵子树是满的,那么所有点都有右儿子。证明:根据向下取整,右儿子严格多/强于左儿子。
-
方案:【先走上一层的一些点,然后再走下来把这一层剩下的走完】可以被只走 1 层的所有点替换。证明根据上面那个性质。
然后你跨越转移和同层转移的代价就好算了,只有最后一层不满的时候有区别。然后用前缀优化到线性对数 dp。
T3:
我有一个平方的 dp 做法,并且还需要把 3 次方的合并优化成平方。
和正解不知道有什么联系,直接看正解:
给我讲题的是 zyr,后面忘了。
先对于每个点 \(i\) 考虑贡献:
枚举其 \(H\),表示第 \(i\) 个数的积水高度大于等于 \(H\)(如果是大于等于,那么每次代价就是 1,如果是等于确实不好算)。然后计算方案数。那么要求:
-
前缀和后缀最大值都要大于等于 \(H\)。
-
\(H\) 要大于当前的 \(a_i\) 或 \(b_i\)。
其实最难的就是第一个限制,可以根据套路进行容斥:
-
直接计算复杂度单次就平方了,直接爆。
-
容斥 1:总方案数 减去 存在一边最大值小于 \(H\) 的情况。
-
容斥 2:后面那个 等于 钦定前缀全部小于 \(H\) 加上 钦定后缀全部小于 \(H\) 减去 全局全部一个小于 \(H\) 的方案数。
维护 \(s_i=[a_i<H]+[b_i<H]\)。方案数就是枚举钦定的是哪一个就可以算里。
上面是一部分,首先我们要优化枚举 \(H\) 的过程,离散化之后从小到大对于每一段 \((L,R]\) 计数。
别忘了我们的容斥基础是:\(h_i<H\) 成立,所以还是要减去 \(h_i\ge H\) 的情况。
然后就可以线段树每次单点修改全局查询了。
虽然独立完成代码花了许久,但还是有收获的。我觉得比直接交 zyr 代码好。毕竟我是从小到大枚举,这要是直接抄代码肯定是改不过来的。