题目链接:D - Range Count Query (atcoder.jp)
题意:给定一个序列,次询问,每次询问给出
。求出
区间内等于
的数字数量
题解:可用主席树做,但没必要(如果出题人把数据范围改为 ,就把主席树卡掉了)。
开一个二维,
里存的数字就是 i 在原序列中所有出现的位置。
对于每个查找值为 的询问,在
内找到第一个大于等于
的位置,再找到第一个小于等于
的位置
两个位置之间的数字个数就是答案
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<vector<int>> g(200010);
int main() {
int n; cin >> n;
for(int i=1; i<=n; i++) {
int t; cin >> t;
g[t].push_back(i);
}
int Q; cin >> Q;
while(Q --) {
int l, r, x;
cin >> l >> r >> x;
auto it_L = lower_bound(g[x].begin(), g[x].end(), l);
if(it_L == g[x].end()) { //如果没有一个下标在大于左区间,则说明l,r区间内没有一个数等于x
cout << 0 << '\n';
continue;
}
int L = it_L - g[x].begin();
//找到最大的小于等于r的数的位置,相当于找到第一个严格大于r的位置再减 1
int R = upper_bound(g[x].begin(), g[x].end(), r) - g[x].begin() - 1;
cout << R - L + 1 << '\n';
}
return 0;
}