Codeforces Round 1052 (Div. 2)
E. Yet Another MEX Problem
https://codeforces.com/contest/2146/problem/E
场上秒了却没时间做的题目。
题意
\(\huge w(l,r) = \sum_{i \in [l,r]} [b_i > mex(l,r)]\)。
\(\large \forall i \in [1,n]\),求出 \(\large \max w(l,i)\)。
做法
看上去就像 ds。
考虑扫描线,扫 右端点。
假设当前右端点为 \(r\)。
1
在固定右端点后,发现前面对于 mex 影响的只有最后一次出现的位置。设为 \(lst_x\)。
2
考虑如果要查询一个 \(w(i,r)\),那么 \(i\) 要选择哪里。
发现应该选择 \(i=lst_x+1\)。
因为这样 \(mex < x\) ,且能选的数最多。
3
因此我们似乎只用维护所有 \(lst_x\) 到当前 \(r\) 中 \(> x\) 的数个数。
这个可以用线段树前缀加单点赋值,在加上全局 max做完。
4
为啥对呢?因为若 \(mex(lst_x+1,r) < x\),那么肯定包含于答案,不影响正确性。
for (int i = 1;i <= n;i++)
{int x;cin >> x;mdf2(1,0,n,x,0); // 单点赋值if (x >= 1)mdf(1,0,n,0,x-1,1);// 区间加cout << query(1,0,n,0,n) << ' ';//全局 max
}