abc 248 d 题解
abc 248 d
题意
给定一个长度为 \(n\) 的序列 \(A\),有 \(Q\) 次询问,每次询问给定三个整数 \(l, r, x\),请你求出在 \(A_l \sim A_r\) 中有多少个值等于 \(x\) 的数。
思路
暴力
每次询问直接暴力从 \(l\) 循环到 \(r\),统计数量。
正解
对于每个 \(i \ (1 \le x \le n)\),都用一个 vector
记录它的所有出现位置,我们把这个 vector
称为 \(pos_i\),并且需要保证每个 \(pos_i\) 内部是单调的。
对于每次询问,二分查找 \(pos_x\) 中第一个大于等于 \(l\) 和第一个大于 \(r\) 的数,并将两个的下标相减即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, a[N], q, l, r, x;
vector<int> pos[N];
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
pos[a[i]].push_back(i);
}
cin >> q;
for (int i = 1; i <= q; i++) {
cin >> l >> r >> x;
auto _r = upper_bound(pos[x].begin(), pos[x].end(), r);
auto _l = lower_bound(pos[x].begin(), pos[x].end(), l);
cout << _r - _l << '\n';
}
return 0;
}