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])