ABC 248 | D - Range Count Query
题目描述
给定一个数组\(A = (a_1, a_2, ..., a_3)\),给定\(Q\)组询问,每组询问给出\(l、r、x\),输出下标\([l, r]\)范围内数值等于\(x\)的元素个数。
数据范围
- \(1 \le N \le 2 \times 10^5\)
- \(1 \le A_i \le N\)
- \(1 \le Q \le 2 \times 10^5\)
- \(1 \le L \le R \le N, 1 \le X \le N\)
题解
由于本题中每个数字的范围是\(2 \times 10^5\),所以可以预处理出每个数字的下标,对于每组询问\(L, R, X\),只需二分查找\(X\)的位置数组,计算在\([L, R]\)范围内的下标的个数即可。
若存入vector中,可直接使用lower_bound()和upper_bound()查询,准确且方便
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 2e5 + 10;
vector<int> vec[N];
int n, q;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i ++){
int x;
scanf("%d", &x);
vec[x].push_back(i);
}
scanf("%d", &q);
while(q --){
int l, r, x;
scanf("%d%d%d", &l, &r, &x);
auto itl = lower_bound(vec[x].begin(), vec[x].end(), l);
auto itr = upper_bound(vec[x].begin(), vec[x].end(), r);
printf("%d\n", itr - itl);
}
return 0;
}

浙公网安备 33010602011771号