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\) 并维护前缀最小值即可。
晚上在造题,,桐柏邀请赛 S10 敬请期待.jpg