2 solutions

  • -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;
    }
    

Information

ID
8704
Time
4000ms
Memory
256MiB
Difficulty
6
Tags
# Submissions
2
Accepted
2
Uploaded By