File tree Expand file tree Collapse file tree 2 files changed +22
-8
lines changed Expand file tree Collapse file tree 2 files changed +22
-8
lines changed Original file line number Diff line number Diff line change @@ -15,5 +15,15 @@ namespace cp_algo {
1515    size_t  kth_set_bit (uint64_t  x, size_t  k) {
1616        return  std::countr_zero (_pdep_u64 (1ULL  << k, x));
1717    }
18+     template <int  fl = 0 >
19+     void  with_bit_floor (size_t  n, auto  &&callback) {
20+         if  constexpr  (fl >= 63 ) {
21+             return ;
22+         } else  if  (n >> (fl + 1 )) {
23+             with_bit_floor<fl + 1 >(n, callback);
24+         } else  {
25+             callback.template  operator ()<1ULL  << fl>();
26+         }
27+     }
1828}
1929#endif  //  CP_ALGO_UTIL_BIT_HPP
Original file line number Diff line number Diff line change 11#ifndef  CP_ALGO_UTIL_SORT_HPP
22#define  CP_ALGO_UTIL_SORT_HPP 
3+ #include  " bit.hpp" 
34#include  < algorithm> 
45#include  < numeric> 
56#include  < ranges> 
67#include  < vector> 
78namespace  cp_algo  {
8-     void  count_sort (auto  &a, size_t  maxc, auto  &&proj = std::identity{}) {
9-         std::vector<int > cnt (maxc);
9+     template <size_t  maxc>
10+     void  count_sort (auto  &a, auto  &&proj = std::identity{}) {
11+         std::array<int , maxc> cnt = {};
1012        for (auto  &x: a) {
1113            cnt[proj (x)]++;
1214        }
@@ -22,13 +24,15 @@ namespace cp_algo {
2224        if (empty (a)) {
2325            return ;
2426        }
25-         int  base = std::bit_floor (size (a));
2627        auto  mx = std::ranges::max (a);
27-         for (int64_t  i = 1 ; i <= mx; i *= base) {
28-             count_sort (a, base, [&](auto  x) {
29-                 return  x / i % base;
30-             });
31-         }
28+         with_bit_floor (size (a), [&]<size_t  floor>() {
29+             constexpr  int  base = std::min<size_t >(floor, 1  << 16 );
30+             for (int64_t  i = 1 ; i <= mx; i *= base) {
31+                 count_sort<base>(a, [&](auto  x) {
32+                     return  x / i % base;
33+                 });
34+             }
35+         });
3236    }
3337}
3438#endif  //  CP_ALGO_UTIL_SORT_HPP
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments