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

posted @ 2022-06-08 08:46  小菜珠的成长之路  阅读(38)  评论(0)    收藏  举报