File tree 3 files changed +14
-7
lines changed
3 files changed +14
-7
lines changed Original file line number Diff line number Diff line change @@ -11,7 +11,7 @@ namespace cp_algo {
11
11
size_t order_of_bit (auto x, size_t k) {
12
12
return k ? std::popcount (x << (bit_width<decltype (x)> - k)) : 0 ;
13
13
}
14
- // Requires GCC target("popcnt, bmi2")
14
+ [[gnu:: target(" bmi2" )]]
15
15
size_t kth_set_bit (uint64_t x, size_t k) {
16
16
return std::countr_zero (_pdep_u64 (1ULL << k, x));
17
17
}
Original file line number Diff line number Diff line change 5
5
namespace cp_algo {
6
6
// coords is a range of reference_wrapper<T>
7
7
auto compress_coords (auto &coords) {
8
- std::vector<int > original;
8
+ using T = std::decay_t <std::unwrap_reference_t <
9
+ std::ranges::range_value_t <decltype (coords)>
10
+ >>;
11
+ std::vector<T> original;
12
+ if (empty (coords)) {
13
+ return original;
14
+ }
9
15
original.reserve (size (coords));
10
16
radix_sort (coords);
11
- int idx = -1 , prev = -1 ;
17
+ size_t idx = -1 ;
18
+ T prev = ~coords.front ();
12
19
for (auto &x: coords) {
13
20
if (x != prev) {
14
21
idx++;
Original file line number Diff line number Diff line change @@ -24,12 +24,12 @@ namespace cp_algo {
24
24
if (empty (a)) {
25
25
return ;
26
26
}
27
- auto mx = std::ranges::max (a);
28
- with_bit_floor (size (a), [&]<size_t floor >() {
27
+ auto [mn, mx] = std::ranges::minmax (a);
28
+ with_bit_floor< 1 > (size (a), [&]<size_t floor >() {
29
29
constexpr int base = std::min<size_t >(floor , 1 << 16 );
30
- for (int64_t i = 1 ; i <= mx; i *= base) {
30
+ for (int64_t i = 1 ; i <= mx - mn ; i *= base) {
31
31
count_sort<base>(a, [&](auto x) {
32
- return x / i % base;
32
+ return (x - mn) / i % base;
33
33
});
34
34
}
35
35
});
You can’t perform that action at this time.
0 commit comments