今天请假逃了晚修来打BC,真的爽(晚上不用6:50去教室: ))
A
题目大意就是一个序列,然后每次覆盖掉一个没有相同元素的连续区间,不能覆盖已经覆盖掉的格子。
直接dp过去,用个map存一下某个元素上一次出现的位置。
B
题目大意:给出一个n位合法十进制,然后要求删掉恰好k个位置上的数,使得剩下的数模3等于零。
1<=n<=105
好麻烦的题目
先枚举最高位的位置i,那就是说这个位置i之前的数全都要删掉,然后显然对于一个数我们只考虑它模3是多少,然后考虑位置i后有r0个数模3等于0,有r1个数模3等于1,有r2个数模3等于2。
假设我们还要删掉k个数,然后要求剩下的位置的数模3等于v
如果v=1那么我们可以用掉一个1(r0,r1-1,r2,k-1)或者两个2(r0,r1,r2-2,k-2)
如果v=2那么我们可以用掉两个1(r0,r1-2,r2,k-2)或者一个2(r0,r1,r2-1,k-1)
以上两种都可以得到v=0的情况
如果v=0,那么我们强制1和2配对的数量不超过2(因为如果有三对就相当于选了3个2和3个1,这样做显然正确)
枚举1和2配对的个数,那么我们尽量选用3个1和3个2,剩下的再用0去补齐。
然后解决
要特判删剩下一个0的情况。
C
题目大意:有一个变换序列a[1..26]为’a’..’z’的排列,随机一个长度为n的由小写字母组成的字符串,经过一次变换后字符c会变成a[c],求随机串变回自己的变换次数的期望×26^n%1000000007
总感觉我的做法是全场写得最麻烦的。。
把变换序列的置换都搞出来
问题可以转化成随机序列的lcm的期望。
由于置换长度最多为26,那么我可以搜出所有可能的lcm,状态数很少,然后直接用矩阵乘法艹过去就好了
D
题目大意:给出集合S,其中有n(n<=30)个数,求满足元素的平方和小于元素的和的平方的子集个数,n个数各不相同
考虑meet in the middle ,得到如下形式
整理得到:
枚举 a1和b1 ,就是一个这样的形式: x+ky>c
那么直接上kd-tree就好了
(mdzz这题这么好写我竟然没有去写