题目内容
给定一个长度为 n n n 的整数数组 a a a 。
Q Q Q 次询问,每次给定一个区间 [ L , R ] [L,R] [L,R] ,问这个区间内有多少 i ∈ [ L , R ] i\in[L,R] i∈[L,R] 且 a i = X a_i=X ai=X 。
数据范围
- 1 ≤ n ≤ 2 × 2 × 1 0 5 1\leq n\leq 2\times 2\times 10^5 1≤n≤2×2×105
- 1 ≤ a i ≤ n 1\leq a_i\leq n 1≤ai≤n
- 1 ≤ Q ≤ 2 × 1 0 5 1\leq Q\leq 2\times 10^5 1≤Q≤2×105
- 1 ≤ L ≤ R ≤ n , 1 ≤ X ≤ n 1\leq L\leq R\leq n,1\leq X\leq n 1≤L≤R≤n,1≤X≤n
题解
由于值域很小,所以可以对每个值构造一个数组,存下这些数对应的下标。
然后对于每个询问,二分对应的值域数组找到左右区间即可。
时间复杂度: O ( n log n ) O(n\log n) O(nlogn)
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<vector<int>> g(n);
for (int i = 0; i < n; ++i) {
int x; cin >> x;
x--;
g[x].push_back(i);
}
int Q;
cin >> Q;
while (Q--) {
int L, R, X;
cin >> L >> R >> X;
L--, R--, X--;
int ans = 0;
auto itL = lower_bound(g[X].begin(), g[X].end(), L);
if (itL != g[X].end()) {
auto itR = upper_bound(g[X].begin(), g[X].end(), R);
ans = int(itR - itL);
}
cout << ans << "\n";
}
return 0;
}