CF1704
vp 拿到了 rk5500+ 的成绩,不愧是我。
以后的总结里我认为比较有意义的题会标 \(!\),难题标 \(*\)。
C(贪心)
开始读错题了以为是序列,后来发现是个环。。假设 \(i\) 和 \((i\bmod m)+1\) 之间的长度是 \(L_i\),可以发现每次取最长的最优,直接做就好了。
\(!\)D
神秘题。算是对数列下标的一个观察。
考虑寻找一个不变量,而在值域上观察没有什么好的结果。考虑操作 \((i,j)\to(i-1,j+1)\) 和 \((i,j)\to (i-1,j+2)\) 的区别,发现后面下标的和是 \(i+j+1\),前面则不变。所以假如我们把每个“1”看做球,数组位置看做盒子,假如对每个球所处的盒子编号求和那么前面和不变后面和恰好 \(+1\)。之后就不难做了。
E(DP)
全部都非 \(0\) 很好做。引入 \(f_i\) 表示 \(i\) 归零的时间,那么有转移 \(f_v=a_v+\sum_{(u,v)\in E} f_u\)。如果有 \(0\) 那么就模拟一下使得所有可能非 \(0\) 的位置非 \(0\)。这个过程最多 \(O(n)\) 步,可以直接模拟。
\(!\)F(博弈、SG 函数)
开始以为不能碰白格子懵逼了好久。
两边的策略显然是先抢对方的再碰自己的。如果 R,B 数量不相等就做完了。如果 RB 数量相等,那么第一个拿不到 RB 的人就输了。此时游戏变成了一个公平组合游戏,可以引入 SG 函数来处理。把形如 RBRBRBR 的子区间提取出来,那么当前局面的 SG 值就是它们的异或和。对于单个子区间,答案只和它的长度有关。引入 \(f_n\) 表示长度为 \(n\) 的 SG 值,它的所有后继局面是 \(\forall i\in [0,n-2],[i]\times[n-i-2]\)(此处用 \(\times\) 表示游戏的组合),DP 可以 \(O(n^2)\) 求出 \(f\)。把 \(f\) 打个表发现有个长度为 \(34\) 的循环节。这样就可以 \(O(n)\) 做了。
找循环节可以善用 Ctrl+F。
\(*\)G(字符串匹配、构造)
想了两天后放弃的题。
先考虑枚举起点 \(i\) 然后判断,如果把 \(a_i\) 和 \(a_{i+1}\) 放在一起观察,就可以发现 \(b_j-a_i+b_{j+1}-a_{i+1}\) 恰好为 \(\sum_{j=1}^{i+1} [j\in S](-1)^{j-i+1}\)。如果把相邻两项做差,可以发现它代表的就是 \(i+2\) 是否放置,这个值是在 \([0,1]\) 之间的。
定义 \(c_i\) 表示 \(a_{i-2}+2a_{i-1}+a_i\),\(d_i\) 为 \(b_{i-2}+2b_{i-1}+b_i\),那么一个必要条件是 \(\forall j\in[i+2,i+m-1],d_{j-i+1}-c_j\in[0,1]\)。这像极了一个字符串匹配问题,可以用 FFT 做到 \(O(n\log n)\) 或者用 bitset 做到 \(O(n^2/w)\)。
上面的考虑实际上忽略了 \(a_i\) 和 \(a_{i+1}\) 的处理。我们需要 \(i+1\) 以前操作对 \(a_i\) 操作的和为 \(b_1-a_i\),并且奇偶个数差为 \(b_1+b_2-a_i-a_{i+1}\)。这个问题相当于在 \(\{0,2,4,\cdots\},\{1,3,5,\cdots\}\) 中各自选 \(a,b\) 个数使得 \(b-a=x\) 且差为 \(y\)。可以先钦定选所有偶数,然后问题就相当于在 \([1,i+1]\) 中选 \(p\) 个数使得和为 \(q\)。连续非负整数中选数的一个结论是若所有能表示出来的数是连续的,那么只要求最小值和最大值即可。构造的话只需要从大往小选,如果不选会使得后面不合法就选。到这里就做完了。
一些反思:虽然考虑 \(i\) 和 \(i+1\) 对应的两个相关限制很精妙,但事实上如果把选与不选看做 \(0/1\),那么条件相当于一个方程组。做一下消元就可以立即得到上面结论。还有这个选数问题先钦定竟然没想到,枯了。
一些补充:用 FFT 做字符串匹配的过程是把匹配的条件转化成一个代数式,并使他为 \(0\)。比如这里就是 \((d_i-c_j)(d_i-c_{j}-1)=0\)。然后条件的逻辑与相当于求和后也为 \(0\),这可以用 FFT 求出来。用 bitset 实际上就是考虑字符 \(d_j\) 能与哪些位置匹配,然后对所有 \(d_j\) 对应的位置取交就是答案。不能直接上 KMP 的原因是真实的 border 可能比传统意义上的 border 要长,因为匹配并不一定完全相等。
\(!\)H1
上面那个 G 已经消耗掉了我改 H 的欲望,所以咕了
还是来补下 H1。一开始被题目的奇怪操作折磨了好久,然后才意识到可以建图。建出图来被 \(p_i\) 干扰了好久还是不会做。。
考虑固定 \(b\) 计数 \(a\),那么 \(b\) 对 \(a\) 的一个显然的限制是:\(b_i\neq i,a_{b_i}=i\)。尝试在抽象的模型上讨论问题。把这个限制建个图可以发现合法的图为若干条链,并且这样的链集合和原来的 \(b\) 是一一对应的。那么继续考虑什么样的 \(a\) 能构造出链。这个问题等价于考虑链的顶端和孤立点怎么填。链的顶端是任意填的,单点不能填链尾因为我们不能通过操作 \(p\) 来让后面的点覆盖这个单点的操作。上面就是一个充要条件了。那么可以枚举单点和链的个数。答案为:
\(i\) 是单点个数,\(j\) 是链的个数。意思是先把 \(i\) 个点分开并标号,然后把点看成球,链看成盒子塞进去。最后由于盒子是没区别的所以除个 \(j!\) 即可。
看到这种奇怪的题多建图,多分离无关条件,还有不要看到啥都想 DP。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号