Loading

abc 248 d 题解

abc 248 d

AT 链接

洛谷链接

题意

给定一个长度为 \(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;
}
posted @ 2024-09-20 17:09  chengning0909  阅读(3)  评论(0编辑  收藏  举报