Luzhiled's Library

This documentation is automatically generated by competitive-verifier/competitive-verifier

View the Project on GitHub ei1333/library

:heavy_check_mark: Static Range Frequency (区間の値の出現回数) (other/static-range-frequency.hpp)

数列が与えられたときに、ある値が出現する回数を求めるクエリを処理します。

コンストラクタ

StaticRangeFrequency< T >(const vector<T> &xs)

数列を xs で初期化します。

Tvs の各要素の型です。

計算量

query

size_t query(int l, int r, T x) const

$xs[l, r)$ に $x$ が出現する回数を返します。

制約

計算量

Verified with

Code

template <typename T>
struct StaticRangeFrequency {
 private:
  vector<T> vs;
  vector<vector<int> > mp;

 public:
  explicit StaticRangeFrequency(const vector<T> &xs) : vs{xs} {
    sort(vs.begin(), vs.end());
    vs.erase(unique(vs.begin(), vs.end()), vs.end());
    mp.resize(vs.size());
    for (int i = 0; i < xs.size(); i++) {
      int p = lower_bound(vs.begin(), vs.end(), xs[i]) - vs.begin();
      mp[p].emplace_back(i);
    }
  }
  size_t query(int l, int r, T x) const {
    int p = lower_bound(vs.begin(), vs.end(), x) - vs.begin();
    if (p == vs.size() or x != vs[p]) return 0;
    l = lower_bound(mp[p].begin(), mp[p].end(), l) - vs.begin();
    r = lower_bound(mp[p].begin(), mp[p].end(), r) - vs.begin();
    return r - l;
  }
};
#line 1 "other/static-range-frequency.hpp"
template <typename T>
struct StaticRangeFrequency {
 private:
  vector<T> vs;
  vector<vector<int> > mp;

 public:
  explicit StaticRangeFrequency(const vector<T> &xs) : vs{xs} {
    sort(vs.begin(), vs.end());
    vs.erase(unique(vs.begin(), vs.end()), vs.end());
    mp.resize(vs.size());
    for (int i = 0; i < xs.size(); i++) {
      int p = lower_bound(vs.begin(), vs.end(), xs[i]) - vs.begin();
      mp[p].emplace_back(i);
    }
  }
  size_t query(int l, int r, T x) const {
    int p = lower_bound(vs.begin(), vs.end(), x) - vs.begin();
    if (p == vs.size() or x != vs[p]) return 0;
    l = lower_bound(mp[p].begin(), mp[p].end(), l) - vs.begin();
    r = lower_bound(mp[p].begin(), mp[p].end(), r) - vs.begin();
    return r - l;
  }
};
Back to top page