模拟36 题解

A. 字符

题中保证$p_i<=1e5$,还可以很显然地发现当总长度大于$p_{max}+c$,一定不会更优。

于是枚举长度的大小。

将每一个限制对长度取模。

显然如果相邻两个字符所在的区间存在交集,就表示状态非法。

于是得到$O(m*p_{max})$的暴力。

发现在取模的过程中如果已经不合法,可以直接跳出。

 

在随机数据下这个算法已经很优秀,

但如果特殊构造也是能卡掉的:比如给出10000个字符0的位置,大部分算法无法剪枝。

 

考虑优化。

我们要求的其实就是每个字符在模意义下的最小值和最大值。

于是直接预处理出每个点左右最近的一个有字符的点。

在统计过程中不断给下标+len,表示当前考虑的一段区间,同一段区间内的最值是显然的。

根据调和级数,这样做的复杂度为$O(p_{max}*logp_{max})$

 

考试时这个题刚开始打的暴力,过了样例直接交了。

因为有一个比较自信很难卡的剪枝,通过显示$submit$的时间,我猜测应该是A掉了。

但心里还是很不安,打了一个st表,复杂度对了,调了一个小时。

考完才发现暴力没删$freopen$,所以打了正解反而是对的?

 

B. 蛋糕

直接区间dp,

考虑一下哪些状态是合法的就完了。

 

 

 

C. 游戏

考虑一条性质:

由岐的路径一定为被一个莉露露带着跑,抛出,然后下一个没有动过的莉露露过来带着跑并抛出。

第n个莉露露一定不会动。

于是问题转化为最短路问题。

暴力建边有$X^3$个,算上$dijkstra$的复杂度已经$O(X^3log)$,过不去。

所以考虑优化建边。

对于$a=0$,线段树优化建边是可行的。

但是在$a!=0$的情况下,每个点向其它点的边权值为一个等差数列,线段树就萎了。

考虑网络流中常用的建图技巧:

每次移动的增量a是固定的,

所以将每个点拆为三个点,分别表示在这个点,在这个点行方向被抛出中,在这个点列方向被抛出中。

以下为具体建边:

1.点1向点2,3建边,权值为让最近莉露露过来。

2.点2,3向点1建边,权值为退出状态的b。

3.点1向周围四个点建边,权值为c。

4.点2,3分别向行、列建边,权值为a。

精髓主要在于拆点的操作和第四种建边,成功地把一些边合在了一起,保证了边的数量为$X^2$级别。

posted @ 2019-09-05 12:19  skyh  阅读(183)  评论(0编辑  收藏  举报