NOIPro 模拟赛 | R15
习惯了谎话,早已分不清真假。
其实这场出得还挺好的,让我们为出题人点赞!
T1
做了 45 分钟,废了。
首先想到:从小到大加数,然后加到合法的时候再回来删除多余数。
很容易被 hack,比如前面有 2,3 把左边覆盖完了,中间来一个 4。最终我们必定将这个 4 删掉,显然不优。
场上根据这个反例就发现中间一行、一列的点非常重要,然后手搓了一下样例发现:选择的数不会很多。
又:一个数至少会覆盖一个角。
于是大胆猜测:至多选择 4 个数。看上去也是比较显然的,因为一个角的位置用 2 个位置覆盖真的不优。
那么根据选择多少数讨论就做完了。
T2
首先理解题意,然后注意到 \(b_x=0\),所以前后是独立的问题。
后面只需要 b 单调不增,这个是经典结论,\(\text{C}(len+V,len)\)。(花絮:打牛客时碰到这个东西,放平方过就打了个 dp,赛后发现题解用了组合数,于是就记住了)
前面的 \(O(n^2)\) 前缀和优化 dp 也非常显然,然后就有 64pts 了。这也是我的最终分数。
赛后我惊讶的发现,有些人和我是相反的。只能说太神奇了。
注意到我们前面优化 dp 时根据 a 推出了上一个 b 的范围。
写出的式子化简后变成:\(b_i-b_{i-1}\le a_i-a_{i-1}\)。
这个时候转化成差分,然后根据 \(b\) 数组和其差分构成双射,就做完了。
观察能力为 0?
T3
待会写。
\(S=2\) 时对于每一行连接 \((a_{i,1},a_{i,2})\),正反方向表示在左边还是右边。
神奇地发现最后让每个数出入度相等/差 1 即可,跑欧拉回路。
对于差 1 的情况就加个源点连向奇数点即可。由于一条边加入的度数是 2,所以整个图度数是偶数,也就是有偶数个奇点,所以源点最后度数也是偶的。
分治是因为 m 是二次幂,并且尝试拓展 \(S=2\) 的思路。
如果我们随便把一列钦定到另外一列(如果跨越 mid 交换),这成立吗?
证明考虑:如果这一列某些要交换的数都去到了另外一列,这是显然没有必要的,因为我们可以在分治这一边的时候再交换原来的一列和另外的一列,分治另一边同理。
所以每次分治都做 \(S=2\) 的情况即可。
拓展
这种类型的题目还有:CF429E 和 CF547D。没做过所以考场上不会情有可原
后面那个题一眼 \(x\to y\) 连边,差不多就和 T3 一样了。
前面那个题显然你不能每个线段向点连边,不然这些边的定向可能不一样就矛盾了。
转化成差分,连边 \(l\to r+1\)。
T4
直接记忆化搜索就可以获得 64pts,我们是优秀的暴力。
T4 做题过程:挨着题有 24 暴力 -> 36 -> wc 20000 刚好放平方过!(48) -> A 可过(56) -> 测了 B 的大洋例发现过了!(64)。
结论:
若 \([l,r]\) 和 \([l',r']\) 的并是 \([L,R]\),且交不为空,那么 \(f^k(L,R)=f^k(l',r')\bigcup f^k(l,r)\)。
先证明:\(f(L,R)=f(l',r')\bigcup f(l,r)\)。
因为 \([l,r],[l',r']\) 值域有交,所以交的那些值域中 \([mn,mx]\) 都是存在于 \(f(L,R)\) 中的。另外 2 部分的 \([mn,mx]\) 和交的部分拼起来就是 \([L,R]\) 的答案。
k 次方呢?对于后面部分,由于一次过后他们相交,故第二次的时候他们本来是相交的,运用上面的结论一直做还是相交的。
对于前面部分,我们可以设最后是 \([mn,mx]\),容易证明后面的区间也一定能取到 \(mn,mx\)。
根据类似的证明可以得出结合律,于是 \(f^k(L,R)=\bigcup_{i\in S}f^k(l_i,r_i)\)。
先用倍增求出:\(dp(k,j,i)\) 表示 \(l=i,r=i+2^j-1\) 的 \((l,r)\) 进行 \(2^k\) 次次方过后的区间,根据 \(f^{2^k}=f^{2^{k-1}}(f^{2^{k-1}}(l,r))\) 转移即可,因为我们知道 \(f^{2^{k-1}}\) 的 \((l,r)\),所以很好解决。
考虑 st 表合并的时候两个区间是一定相交的,就做完了。这题真神,喷不了。
不管是打比赛还是做练习,每一道题都要有:
1.思维过程(细心读题、大致思考、认真草稿)
2.书写过程(仔细打代码,做到打了就不会出现低级错误)
3.检查过程(算法正确性的检查、时空复杂度的检查、重要的题目在有时间的情况下一定对拍)
4.总结过程(遇到很妙的题、总是犯错误的知识点,做到总结及举一反三)
如果平时训练也能这样严格执行,时间久了,你一定会受益匪浅!加油!