Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.98 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <array>
  4. #include <list>
  5. #include <algorithm>
  6. #include <immintrin.h>
  7. #include <string.h>
  8. #include <xmmintrin.h>
  9. using MINT = int32_t;
  10. constexpr size_t no_players = 416;
  11. constexpr size_t max_marble = 7161700;
  12.  
  13. template<typename T, size_t growth_factor>
  14. struct container{
  15.     std::vector<T> data;
  16.     std::vector<T> data_new;
  17.     size_t pos = 0;
  18.     container() : data(growth_factor){
  19.         std::fill(data.begin(), data.end(), -1);
  20.         data[pos] = 0;
  21.         pos += growth_factor/2;
  22.         data[pos] = 1;
  23.         data.reserve(8000000);
  24.         data_new.reserve(8000000);
  25.     }
  26.    
  27.     void resize(){
  28.         size_t pos_new;
  29.         data_new.reserve(data.size() * growth_factor);
  30.         for(size_t i = 0; i < data.size(); i++){
  31.             if(data[i] != -1){
  32.                 data_new.push_back(data[i]);
  33.                 if(pos == i){
  34.                     pos_new = data_new.size() - 1;
  35.                 }
  36.                 for(size_t j = 0; j < growth_factor; j++){
  37.                     data_new.push_back(-1);
  38.                 }
  39.             }
  40.         }
  41.         pos = pos_new;
  42.         std::swap(data, data_new);
  43.         data_new.erase(data_new.begin(), data_new.end());
  44.         //data = std::move(data_new);
  45.     }
  46.    
  47.     void seek_previous(){
  48.         while(pos > 0){
  49.             pos--;
  50.             if(data[pos] != -1){
  51.                 return;
  52.             }
  53.         }
  54.         pos = data.size() - 1;
  55.         seek_previous();
  56.     }
  57.    
  58.     void seek_next(){
  59.         while(pos < data.size() - 1){
  60.             pos++;
  61.             if(data[pos] != -1){
  62.                 return;
  63.             }
  64.         }
  65.         pos = 0;
  66.         if(data[pos] != -1){
  67.             return;
  68.         }
  69.         seek_next();
  70.     }
  71.    
  72.  
  73.    
  74.     void insert(T value){
  75.         size_t tmp_pos = pos;
  76.         seek_next();
  77.         size_t lower = pos;
  78.         seek_next();
  79.         size_t upper = pos;
  80.         if(lower > upper){
  81.             if(lower == data.size() - 1){
  82.                 pos = tmp_pos;
  83.                 resize();
  84.                 insert(value);
  85.                 return;
  86.             }
  87.             else{
  88.                 size_t diff = (data.size() - 1) - lower;
  89.                 if(diff == 1){
  90.                     pos = data.size() - 1;
  91.                     data[pos] = value;
  92.                     return;
  93.                 }
  94.                 else{
  95.                     size_t pnew = lower + diff / 2;
  96.                     data[pnew] = value;
  97.                     pos = pnew;
  98.                     return;
  99.                 }
  100.             }
  101.         }
  102.         else{
  103.             size_t diff = upper-lower;
  104.             if(diff == 1){
  105.                 pos = tmp_pos;
  106.                 resize();
  107.                 insert(value);
  108.                 return;
  109.             }
  110.             size_t pnew = lower + diff / 2;
  111.             data[pnew] = value;
  112.             pos = pnew;
  113.         }
  114.     }
  115.    
  116.     T remove(){
  117.         for(size_t i = 0; i < 7; i++){
  118.             seek_previous();
  119.         }
  120.         T value = data[pos];
  121.         data[pos] = -1;
  122.         seek_next();
  123.         return value;
  124.     }
  125.    
  126.     void print(bool print_empty = false){
  127.         for(auto i : data){
  128.             if(i!=-1 or print_empty)
  129.                 std::cout<<i<<" ";
  130.         }
  131.         std::cout<<std::endl;
  132.     }
  133.    
  134.    
  135. };
  136.  
  137.  
  138. int main(){
  139.     for(size_t i = 0; i<20; i++){
  140.         container<MINT, 3> marbles;
  141.         std::array<int64_t, no_players> scores = {0};
  142.        
  143.         MINT marb = 2;
  144.        
  145.         while(true){
  146.             if(marb % 23 == 0){
  147.                 scores[marb % no_players] += marb + marbles.remove();
  148.             }
  149.             else{
  150.                 marbles.insert(marb);
  151.             }
  152.            
  153.             marb++;
  154.             if(marb == max_marble){
  155.                 auto max = *std::max_element(scores.begin(), scores.end());
  156.                 std::cout<<max<<std::endl;
  157.                 break;
  158.             }
  159.         }
  160.     }
  161.  
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement