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
}
posted @ 2025-09-22 09:43  codwarm  阅读(99)  评论(0)    收藏  举报