Skip to content

Instantly share code, notes, and snippets.

@rikuTanide
Created February 21, 2020 01:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rikuTanide/ded88897c3ddb0d78e02d811efb821ec to your computer and use it in GitHub Desktop.
Save rikuTanide/ded88897c3ddb0d78e02d811efb821ec to your computer and use it in GitHub Desktop.
配列の中でA以上B以下の要素の数などを簡単に求める
// startは含む
// endは含まない
RangeCount range_count(vector<int>::iterator start, vector<int>::iterator end, int l, int r) {
if (l > r) return RangeCount{0, 0, 0, 0, 0};
if (start >= end) return RangeCount{0, 0, 0, 0, 0};
if (l == r) {
RangeCount rc;
auto it_u = upper_bound(start, end, r);
auto it_l = lower_bound(start, end, r);
rc.upper = distance(it_u, end);
rc.r_equal = distance(it_l, it_u);
rc.between = 0;
rc.l_equal = rc.r_equal;
rc.lower = distance(start, it_l);
return rc;
}
RangeCount rc;
auto it_ru = upper_bound(start, end, r);
auto it_rl = lower_bound(start, end, r);
rc.upper = distance(it_ru, end);
rc.r_equal = distance(it_rl, it_ru);
auto it_lu = upper_bound(start, end, l);
auto it_ll = lower_bound(start, end, l);
rc.between = distance(it_lu, it_rl);
rc.l_equal = distance(it_ll, it_lu);
rc.lower = distance(start, it_ll);
return rc;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment