2 solutions
-
-2
莫队,易得
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int blo = 320; int bel[N]; int cnt[N]; int ans = 0; int a[N], n, m; vector<int> b; int rn[N]; int res[N]; struct Query { int l, r, id; bool operator<(const Query& g) const { return ((bel[l] ^ bel[g.l]) ? (bel[l] < bel[g.l]) : ((bel[l] & 1) ? (r < g.r) : (r > g.r))); } }q[N]; void del(int x) { int p = a[x]; int np = rn[p]; ans -= (cnt[p] == np); cnt[p]--; ans += (cnt[p] == np); } void add(int x) { int p = a[x]; int np = rn[p]; ans -= (cnt[p] == np); cnt[p]++; ans += (cnt[p] == np); } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b.emplace_back(a[i]), bel[i] = i / blo; sort(b.begin(), b.end()); b.erase(unique(b.begin(), b.end()), b.end()); for (int i = 1; i <= n; i++) { int pn = a[i]; a[i] = lower_bound(b.begin(), b.end(), a[i]) - b.begin() + 1; rn[a[i]] = pn; } for (int i = 1; i <= m; i++) { scanf("%d%d", &q[i].l, &q[i].r); q[i].id = i; } sort(q + 1, q + m + 1); int nl(1), nr(0); for (int i = 1; i <= m; i++) { int l(q[i].l), r(q[i].r); while (nl > l) add(--nl); while (nr < r) add(++nr); while (nl < l) del(nl++); while (nr > r) del(nr--); res[q[i].id] = ans; } for (int i = 1; i <= m; i++) printf("%d\n", res[i]); return 0; }
- 1
Information
- ID
- 8704
- Time
- 4000ms
- Memory
- 256MiB
- Difficulty
- 6
- Tags
- # Submissions
- 2
- Accepted
- 2
- Uploaded By