B. Little Elephant and Array
(莫队板子)
题意:在区间[l, r] 中有多少个数x ,其出现次数也为x
链接
#include <bits/stdc++.h>
using namespace std;const int N = 1e5+10 ;
int a[N] , cnt[N];
int ans[N];
int n , q ;
int res = 0 ;
struct node {int id, l, r;
}all[N] ;
int len ;
bool cmp(node a, node b) {if(a.l / len != b.l / len) return a.l < b.l;else return a.r < b.r;
}void add(int id ) {if(id > n) return; if(cnt[id] == id) res --;cnt[id] ++;if(cnt[id] == id) res ++;
}
void del(int id ) {if(id > n) return ;if(cnt[id] == id) res --;cnt[id] --;if(cnt[id] == id) res ++;
}int main(){cin>>n>>q ;len = sqrt(n) ; for(int i = 1; i <= n; i ++) cin>>a[i] ;for(int i = 1; i <= q; i ++) {int l, r ;cin>>l>>r ;all[i] ={i, l, r} ;}sort(all + 1, all + q + 1, cmp) ; int ll = 1 , rr =0 ; for(int i = 1; i <= q; i ++) {int id = all[i].id , l = all[i].l , r = all[i].r ;while(ll > l) add(a[-- ll]);while(ll < l) del(a[ll ++]);while(rr > r) del(a[rr --]);while(rr < r) add(a[++ rr]);ans[id] = res ; }for(int i = 1; i <= q; i ++) cout<<ans[i] <<"\n"; return 0 ;
}