题解 | #牛牛的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);
}
}
SHEIN希音公司福利 287人发布