2 solutions

  • 1
    @ 2023-5-22 14:45:36

    显然莫队。

    • -2
      @ 2023-5-15 15:28:49

      莫队,易得

      #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