题解 | #牛牛的mex#

牛牛的mex

https://ac.nowcoder.com/acm/problem/210690

二分!

为什么没有人写二分!补集思想确实好,但是我没有想到orz

题解还有好几个莫队,对的对的,这种区间问题就应该莫队,但我当时懒得写分块了(

可以这么写本质上是因为我们可以线性的预处理出包含0,01,012,0123...的最小区间,然后不难发现mex越大对区间的要求越苛刻,对结果进行二分答案即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, q, a[100005], b[100005], ql, qr;
pair<int, int> yuna[100005];
bool isgood(int x) {
    auto [fl, fr]=yuna[x];
    if(ql<=fl&&qr>=fr) return 1;
    return 0;
}
void dd(int l, int r) {
    if(l+1==r) {
        cout<<r<<'\n'; return;
    }
    int mid=l+r>>1;
    if(isgood(mid)) l=mid;
    else r=mid;
    dd(l, r);
}
signed main() {
    cin>>n>>q;
    for(int i=1; i<=n; i++) {
        cin>>a[i]; b[a[i]]=i;
    }
    yuna[0]={b[0], b[0]};
    for(int i=1; i<n; i++) {
        auto [fl, fr]=yuna[i-1];
        if(b[i]<fl) yuna[i]={b[i], fr};
        else if(b[i]>fr) yuna[i]={fl, b[i]};
        else yuna[i]={fl, fr};
    }
    while(q--) {
        cin>>ql>>qr;
        if(ql==1&&qr==n) cout<<n<<'\n';
        else if(ql>b[0]||qr<b[0]) cout<<0<<'\n';
        else dd(0, n-1);
    }
}
全部评论

相关推荐

2025-11-06 23:30
已编辑
华中师范大学 后端工程师
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务