2022.7.24 做题记录

Luogu8445 射命丸文的取材之旅 Present 6

给定序列 \(\{a_n\},\{b_n\}\),求一个序列 \(\{c_n\}\) 满足 \(\forall i\in[1,n],c_i\in\{a_i,b_i\}\),最大化

\[\max\{r-l+1-\operatorname{mex}\{c_l,c_{l+1},\dots, c_{r-1},c_r\}\}(1\le l\le r\le n) \]

并输出该式子可能的最大值。\(1\le n\le 10^6,0\le a_i,b_i\le n\)

考虑枚举 \(\text{mex}=x\),并算出最长的区间长度。

要使区间内 \(\text{mex}=x\),需要满足:

  • 区间内没有出现过 \(x\)
  • \([0,x-1]\) 内的数都在区间内出现过。

我们可以把所有 \(x\) 都找出来,只需要查询每段区间内是否出现过所有 \([0,x-1]\) 内的数即可。

这个是经典问题,可以用主席树做到 $1\log $,但是显然不是我们想要的。

然后我们发现其实第二个条件可以直接不管。

为什么呢?因为只要满足第一个条件就意味着 \(\text{mex}\le x\),如果第二个条件不满足那意味着我们在枚举 \(x\) 前面的某个数时已经枚举过正确的 \(\text{mex}\) 值了。所以只需要考虑第一个条件就行了。

vector 存一下每个数出现位置即可,复杂度 \(O(n)\)AC Code

Luogu8446 虹色的北斗七星 Future 7.0

你有一个长度为 \(n\) 的序列 \(a\),它的一个区间 \([l,r]\) 的价值是

\[\max\{a_l,a_{l+1},\cdots,a_r\}-\min\{a_l,a_{l+1},\cdots,a_r\}-r+l-1 \]

求这个序列价值最大的子区间并输出这个价值。\(1\le n\le 4\times 10^6,1\le a_i\le 10^9\)

这题很容易想歪到笛卡尔树/双指针一类的东西上去(比如我),所以我评了 \(7.0\)

可以发现最优区间一定满足其中一个端点是最大值,另一个端点是最小值。

不妨设 \(a_r\) 为最大值,\(a_l\) 为最小值,那么原式即为 \(a_r-r-(a_l-l)-1\)

\(b_i=a_i-i\),问题转化为找到一组 \(i>j\) 使得 \(b_i-b_j\) 最大。直接枚举 \(i\) 并维护前缀最小值即可。

AC Code

晚上在造题,,桐柏邀请赛 S10 敬请期待.jpg

posted @ 2022-07-24 23:32  云浅知处  阅读(46)  评论(0编辑  收藏  举报