回滚莫队板子题已 AC 但有疑问

P4137 Rmq Problem / mex

第 `i` 个数所属的块是 `(i-1)/len+1` #### AC code: ``` #include <bits/stdc++.h> using namespace std; #define MAXN 200001 int n, m, res, lasb(-1), l(1), r, minn; int L[MAXN]; int a[MAXN], bu[MAXN], ans[MAXN], bu2[MAXN]; struct Que{int l, r, id;}que[MAXN]; void del(int x, int &res){ if (!(--bu[x])) res = min(res, x); } void rem(int x){++bu[x];} signed main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; for (int i(1); i<=n; ++i){ cin >> a[i]; if (a[i] <= n+1) ++bu[a[i]]; } while (bu[res]) ++res; for (int i(1); i<=m; ++i){ cin >> que[i].l >> que[i].r; que[i].id = i; } int len(sqrt(n)), tot((n-1)/len+1); for (int i(1); i<=tot; ++i) L[i] = (i-1)*len+1; // 1 sort(que+1, que+m+1, [len](Que a, Que b){ if ((a.l-1)/len == (b.l-1)/len/*第一处修改*/) return a.r > b.r; return (a.l-1)/len < (b.l-1)/len;/*第二处修改*/ }); r = n; for (int i(1); i<=m; ++i){ if ((que[i].l-1)/len == (que[i].r-1)/len/*第三处修改*/){ for (int j(que[i].l); j<=que[i].r; ++j) ++bu2[a[j]]; int tmp(0); while (bu2[tmp]) ++tmp; for (int j(que[i].l); j<=que[i].r; ++j) --bu2[a[j]]; ans[que[i].id] = tmp; continue; } if (lasb ^ ((que[i].l-1)/len+1)/*第五处修改*/){ while (r < n) rem(a[++r]); while (l < L[(que[i].l-1)/len+1]/*第六处修改*/) del(a[l++], res); // 2 lasb = (que[i].l-1)/len+1;/*第七处修改*/ minn = res; } while (r > que[i].r) del(a[r--], minn); int tmp(minn), lp(l); while (lp < que[i].l) del(a[lp++], tmp); while (lp > l) rem(a[--lp]); ans[que[i].id] = tmp; } for (int i(1); i<=m; ++i) cout << ans[i] << '\n'; return 0; }
by pig1121 @ 2024-02-09 13:34:53


@[rainygame](/user/804607)
by pig1121 @ 2024-02-09 13:35:48


|