学军联赛模拟 第十八测 题解

Posted evenbao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学军联赛模拟 第十八测 题解相关的知识,希望对你有一定的参考价值。

(A.)

首先有个朴素的动态规划思路 , 记 (f_{i , j}) 表示前 (i) 个位置 , 最后一个位置的颜色是 (j) 的方案数。

转移要用到容斥原理 , 用总方案数减去 (j) 连续出现 (a_{j} + 1) 次的方案数。 记 (g_{i} = sum{f_{i , j}})。 则 (f_{i , j} = g_{i - 1} - (g_{i - a_{j} - 1} - f_{i - a_{j} - 1 , j}))

注意到对于 (a_{j}) 相同的颜色显然状态相同 , 可以分批转移。 时间复杂度 : (O(N ^ 2))

(B.)

二分答案 , 将每个数减去 (x) , 那么要求的转化为序列中总和大于 (0) 的区间个数。

这个问题可以用树状数组等数据结构求解二维偏序得到。

但事实上可以不用数据结构 , 因为插入排序的时间复杂度是 (O(逆序对个数)) , 所以可以直接运行插入排序 , 如果超过 (K) 次交换操作就直接返回。

这样的时间复杂度是 (O(NlogN)) 的。

附核心代码 :

技术图片

(C.)

(dp_{i , j}) 表示考虑了前 (i) 个字符串 , 一个拼合串的后缀为 (s_{i}) , 另一个为 (s_{j}) 的最短长度。

考虑优化 , 不妨将字符串记进状态 , 记 (dp_{i , s}) 表示前 (i) 个字符串 , 有一个串后缀为 (s_{i}) , 另一个有一个后缀是 (s) 的最短长度。

不妨建立字典树存储状态。

这样就有两种状态 :

第一种 , 接在上一个串后面 , 这样相当于给所有的状态加上一个数 , 可以直接在字典树上打标记。

第二种 , 和某一个串"缩"起来 , 这样可以在字典树上取 (min) 得到 , 对于这种情况 , 还需枚举当前串的一个后缀更新树上的节点。

时间复杂度 : (O(NM))

以上是关于学军联赛模拟 第十八测 题解的主要内容,如果未能解决你的问题,请参考以下文章

TYVJ NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解

lzoi模拟赛题解

学军NOIP2016模拟赛1

第十三届蓝桥杯模拟赛(第一期)题解-代码详解(C语言)

2012第十八届全国青少年信息学奥林匹克联赛(NOIP2012)初赛提高组答案

第十三届蓝桥杯模拟赛第二期JAVA组个人题解