Codeforces Round 1052 (Div. 2) E. Yet Another MEX Problem

Codeforces Round 1052 (Div. 2) E. Yet Another MEX Problem

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
}