CF专项

CF1567D:

  要求十进制数转化为十一进制数后的最大值

首先考虑十进制转化为十一进制的收益,也就是10^i转化为11^i

能够发现,位数越高所造成的额外贡献越大,因此不难想到贪心

能够分配高位就分配高位,最后不够分配则降位即可

CF1567E:

  首先看到操作一可以想到动态维护线段树

考虑如何求操作二,能够想到对于一个子串,其所能造成的贡献为

n * (n + 1) / 2,那么可以将序列划分为若干段,其中每一段为一个

最长上升子串,那么问题转化为如何动态维护子串长度(方案数)

  考虑要求一段区间的方案数,能够想到的是维护出以该下标开始

的最长上升子串利,维护的关键在于合并过程,显然只需要判断左右

区间的右左两端是否能合并即可,那么只需要再维护出以该点结尾的

最长上升子串,判断mid两侧最长上升子串长度是否相等即可,最终

区间方案数即为左右区间两侧方案数之和(若两侧区间能够合并则

减去合并的两串的方案再加上合并成的串长方案即可)

CF1567F:

  只有1,4两种数,要求和为5的倍数,同时每个位置最多只有

4个位置可以填数,能够发现只有该位置存在偶数个能填数的位置

才有解

  首先当没有位置时直接略过即可,当存在两个位置时,考虑抽象

出一种模型,发现只有两种颜色且相邻位置颜色不能相同,二分图染色

即可,通过奇环判断无解,考虑四个位置时,策略为将相对的位置

染成相同颜色,证明先咕。。。

CF1562D:

  问题即为奇数位置为+,偶数位置为-,同时每个位置上的数为+/-1

考虑这种+/-1的性质,即序列前缀和在每个时刻最多变化一次。

  分析删除操作,发现在删除一个数之后,后面所有位置的奇偶性质

全部改变,而要求的是一段前缀和为0,那么可以利用正负翻转的性质

进行操作,只需要找到形如x_x的位置即可,那么可以得到,对于区间

前缀和为0直接略过即可,对于前缀和为奇数只需一次操作(删除上述

下划线位置),而前缀和为偶数只需要随意删除一个位置即可转化为

第一种情况,考虑如何求出要删的位置,暴力O(n)的做法是显然的

显然并不需要数据结构进行维护,考虑所求物品的对称性质——x_x,

也就是通过求出x,可以确定要求位置的前缀和,然而由于存在负数,

前缀和并不具有单调性,这里可以转换一下,尽管前缀和不具有单调性

下标却具有单调性,而本题数据范围并不大,于是可以对于每种可能的

前缀和开桶,桶内记录数组下标,利用求出的值的索引,在对应桶内

二分下标即可

CF1562E:

  首先发现将若有子串以首字母分为若干组,暴力求解LIS显然不行,

考虑求解LIS的过程,本题特殊性在于所有子串按其在母串中首字母的

位置进行排序,考虑利用这个性质进行简化LIS运算,发现当在组内求解

时,由于同组首字母完全相同,于是组内LIS完全转化为下一组LIS也就是

问题子结构,这启发可以采用DP求解,考虑猜想对于同一组内若选择

位置i,则i之后的位置一定选择,证明考虑下一组在i后面的位置为j,那么

若j串长度小于i串,也定是j串字典序严格大于i串,i串之后显然可以选择

反之,考虑若i串下一个字母字典序小于j串对应字母同理,而若等于,也

就是i串为j串前缀,显然可以直接从j所在组i串位置进行选择,因此设

f[i]表示前i组的最长上升子序列,转移类比普通转移,发现问题在于求解

公共前缀,预处理LCP[i][j]表示母串i,j位置即之后的LCP

则有转移f[i] = max (f[i],f[j] + (n - i + 1) - LCP[i][j])

上一篇:循环精灵图


下一篇:JS 新浪下拉列表页