给出一个0到n-1的排列p,求有多少子区间$[l,r]$满足$mex(p_l, p_{l+1}, \ldots, p_r) > med(p_l, p_{l+1}, \ldots, p_r)$
mex表示区间内没有出现的最小非负数整数。
med表示区间内整数排序后的第$\left \lfloor{ \frac{|S| + 1}{2} } \right \rfloor$个数,$|S|$是区间内整数的个数。
">MEX vs MED
MEX vs MED
Created by LXC on Fri Oct 27 09:11:39 2023
https://codeforces.com/problemset/problem/1744/F
ranting: 2000
tag: math, two pointers
problem
给出一个0到n-1的排列p,求有多少子区间$[l,r]$满足$mex(p_l, p_{l+1}, \ldots, p_r) > med(p_l, p_{l+1}, \ldots, p_r)$
mex表示区间内没有出现的最小非负数整数。
med表示区间内整数排序后的第$\left \lfloor{ \frac{|S| + 1}{2} } \right \rfloor$个数,$|S|$是区间内整数的个数。
solution
考虑不同mex值的贡献
当mex至少为i时,至少包含了0到i-1在区间中。设0到i-1中最小出现位置为L,最大出现位置为R。
设$pos_i$为i的位置,不妨设$pos_i < L$
从$pos_i+1$到L位置的每个数都是大于i的所以添加后不会影响mex的值,对于mex为i的情况下med小于mex的最大区间为2*i。
遍历从$pos_i+1$到L位置的每个数作为左端点,计算合法区间的右端点的个数。即为mex=i的贡献。
我们将所有不同mex的贡献累计就是答案。
code
1 |
|