康复训练

total: 15

CF1553D: 性质1: t肯定是s的子串。 性质2: 从s中选取的字符之间隔着偶数个字符(字符的下标按照奇偶奇偶奇偶排)。 那么我们可以从1/2开始(代表奇数/偶数位开始, 看是否能找到子串t, 注意, 一个backspace等于删两个), 然后我们就会wa on 19。 我们会发现, 如果n,m奇偶性不同, 从第一个开始选的话, 剩下的是奇数, 如果第一个被选中了, 那么最后一个字符无法删掉。 [s: aacc t:aac]

CF1551E: dp, 设fi表示以i结尾的子序列, 最多能有几个数符合条件, 注意转移点的合法性

CF1553E: 可以发现循环并不会影响相对位置, 只有置换会, 也就是说, 移动k位而不置换, 每一位上是啥都是确定的。 然后发现有m次交换机会, 也就是说, 至多存在2m组数无法配对(即$a[i] eq p_k[i]$)。 进而我们可以考虑用一个数组cnt来统计循环k位后满足$a[i] == p_k[i]$的数, 也就是说, $n - 2m leq cnt[k]$是k符合条件的必要条件。 但实际上, 需要调换的步数可能不止m步(因为2m考虑的是刚好两两互换的情况, 如$a[i]: 1 2 3 4$ $p_k[i]: 2 1 4 3$)。 当满足必要条件时, 合法的k至多3个, 所以最多暴力检索O(3N)次, 因为 $frac{1}{3} n leq n - 2m leq n$ 而且 $sum cnt = n$因为一共有n个数

注意考虑, 必要条件对时间复杂度的优化效果

CF1555E: 线段树维护全局最小值, 线段树pushdown的时候既要传给权值也要传给懒惰标记, 然后按w排序, 当前枚举到的区间是最大的w, 然后线段树区间赋值+查询最小值即可

CF1551D2: 分类讨论, 容易发现两个横的等价于两个竖的(拼成一个$2 imes 2$的矩阵的时候), 然后, 如果n/m其中一个是奇数, 可以用横的/竖的去填补, 因此只需要判断填满多余的/或者没有多余的这一行外, 剩下的横/竖是否有奇数个就可以了

CF20C: dij模板, 标记一下哪里转移过来的就行了, 注意范围long long

CF1554D: 一个长为k的全a串里面有1个长为k的2个长为k-1的…, 因此只需要构造$frac{n}{2}$和$frac{n-1}{2}$的全a串, 中间用'b'/'bc'分隔即可, 注意特判x = 1

记得考虑特殊情况, 如范围的最小/最大, 数据的奇偶性……

CF1549E: 设$dp[i][j] = sum_{j = 1}^{3 * n} C_j^i$, 利用$C_n^m = C_{n-1}^m + C_{n-1}^{m-1}$滚掉一维&&构造状态转移方程

CF1549D: 先考虑两个数的情况, 如果满足$aequiv b (mod x)$那么肯定满足$x|(a-b)$ 因此只需要先对序列差分求绝对值, 然后用线段树/倍增维护区间gcd即可

CF1552D: 爆搜, 存在如果$a_i$合理那么$-a_i$也合理, 只需要验证能否解出0即可

CF1557D: 线段树维护dp, $dp[i]=max{dp[j]+1}(a[i][l]==a[j][l])$离散化后只有2m个点, 维护一下1~i上每一列上最大的$dp[i]$

CF1558B: 调和级数+差分, 用差分优化区间加$[ i*j,(i+1)*j )$中的数对j整除得到的都是i, 对这个区间里的所有数都+f[i]即可, 然后边差分边求前缀和就可以省掉一个f数组

CF1547F: 二分答案+线段树

CF1546D: 组合数学, 每2个1分一组, 然后转换成n+m个位置放n个球的问题

原文地址:https://www.cnblogs.com/gllonkxc/p/15090917.html