期望得分:100+100+55(?)+0=255
实际得分:100+100+0+0=200
迷迷糊糊睡了好一会才起来打……
感觉打的还行,除了 T3 时间太紧了,有的错误没检查出来挂分了。。
T1
简单线性 DP。
\(f_i\) 表示前 i 个数的答案,\(g_i\) 有点抽象,先假设当前在 \(p\),\(a_p = i\),\(g_i\) 表示的是如果 \(p\) 作为左端点被删去那么 \(1\sim p\) 最少会剩下几个数没被删去。然后直接 dp,\(f_i = \max(f_{i - 1},i - g_{a_i}),g_{a_i} = \min(g_{a_i},i-f_{i-1})\)。
T2
想了好一会,还好在快 2h 的时候过了,说明最近做了一点思维题还是有点用的?
记 \(x\) 为 \(k\) 位二进制数。观察发现小于等于 \(k\) 位的数至多只能选 \(2\) 个,这两个数要满足异或大于 \(x\),且位数不能相同。对于位数大于 \(k\) 的,位数不同之间不管怎么异或,最终值都会大于 \(x\),对于位数相同的,两两异或后这一位就没了,对于下一位,可能有下一位为 0 的数也可能有下一位为 1 的,同为 0 和 1 之间互不影响,0 和 0,1 和 1 之间异或就都没了,就继续往下一位考虑……一直考虑到第 \(k\) 位的时候,发现我们就把问题转化成了前面位数小于等于 \(k\) 的问题。接下来就来考虑小于等于 \(k\) 怎么做:从高位往低位考虑,如果 \(x\) 这一位是 1,剩下的数要么这一位全为 1 要么全为 0,那就不能组成异或大于 \(x\) 的数对,所以这些数中只能挑 1 个,反之可以,就往下一位判断。如果 \(x\) 这一位是 0,如果有这一位是 0 也有这一位是 1 的,那么这些数就可以挑 2 个,反之找不到,就往下一位判断。一直到第 0 位还没结束,那么这些数顶到天也只能拿 1 个,因为到这里说明已经等于 \(x\) 了。代码实现有点小复杂,还要小特判一下 \(k=0\) 的情况,时间复杂度应该是 \(\mathcal{O}(n\log V)\)。
T3
打表发现其中一个数列肯定是一堆 1 和一堆 0 拼一起组成的,另一个贪心地尽量打散,考场上没有想到合适的办法,不得已拿出了随机化算法,随机调整,本地测试看上去还行,但是后来发现忘记考虑用 1 打散 0 的情况了……而且输出的时候忘记特判输出反了……有点蠢、、
luogu 第一篇题解讲得很深刻,从匹配数和位置数的角度去考虑,把 \(xy\) 次匹配放到 \(n\) 个位置中,很厉害!!!
T4
感觉很困难……考场上也想不到这么多引理……感觉不是我能做的……摆了。
n <= 3 好像是容易的,写几个分类讨论就行了,可惜来不及写了。
总结:位运算相关不太熟练,T2 因为一些细节思考了一些时间。T3 又是太粗心了,而且没把 SPJ 下载下来测一下,不然也稳妥一点。时间把控还行?应该适当缩短一些思考睡眠时间。