Submission #1261077

#TimeUsernameProblemLanguageResultExecution timeMemory
1261077wheelertHacker (BOI15_hac)C++20
100 / 100
84 ms10312 KiB
#include <deque>      
#include <iostream>   
#include <queue>      
#include <vector>     
                      
#include <set>        
                      
using namespace std;  
struct SlidingWindowMinimum {                                                      
                                                                                   
  SlidingWindowMinimum(int windowSize) : m_windowSize(windowSize) {}               
                                                                                   
  void observe(int index, int value) {                                             
    // hold values in the queue in increasing order, so the minimum is always at   
    // m_inWindow.front()                                                          
    while (m_inWindow.size() > 0 && m_inWindow.back().second > value)              
      m_inWindow.pop_back();                                                       
                                                                                   
    m_inWindow.push_back({index, value});                                          
  }                                                                                
                                                                                   
  // purge anything less than or equal 'to' from the window                        
  void purge(int to) {                                                             
    while (m_inWindow.size() > 0 && m_inWindow.front().first <= to)                
      m_inWindow.pop_front();                                                      
  }                                                                                
                                                                                   
  void print() const {                                                             
    for (const auto [i, v] : m_inWindow) {                                         
      cout << "(" << i << ", " << v << ") ";                                       
    }                                                                              
    cout << endl;                                                                  
  }                                                                                
                                                                                   
  int min() const { return m_inWindow.front().second; }                            
                                                                                   
  std::deque<std::pair<int, int>> m_inWindow;                                      
  int m_windowSize;                                                                
};                                                                                 
                                                                                   
int optimal_solution(vector<int> const &arr) {                                     
  int N = arr.size();                                                              
  int num_window = (N + 1) / 2;                                                    
                                                                                   
  int winmin_index = 0;                                                            
  SlidingWindowMinimum winmin{num_window};                                         
                                                                                   
  static constexpr int INF = 1'000'000'000;                                        
  vector<int> min_answer_per_node(N + 1, INF);                                     
                                                                                   
  std::vector<int> a(2 * N + 1);                                                   
  for (int i = 1; i <= N; ++i) {                                                   
    a[i] = arr[i - 1];                                                             
    a[i + N] = arr[i - 1];                                                         
  }                                                                                
                                                                                   
  for (int i = 1; i <= 2 * N; ++i)                                                 
    a[i] += a[i - 1];                                                              
                                                                                   
  int ans = 0;                                                                     
  for (int i = 1; i <= 2 * N; ++i) {                                               
    // a[i + num_window -1] - a[i - 1] - computes the sum of elements i ... (i +   
    // num_window - 1) inclusive                                                   
    if (i + num_window - 1 <= 2 * N)                                               
      winmin.observe(i, a[i + num_window - 1] - a[i - 1]);                         
    if (i > num_window)                                                            
      winmin.purge(i - num_window);                                                
                                                                                   
    // mod N but then convert back to 1s based indexing                            
    int prev = ((i - 1) % N) + 1;                                                  
    min_answer_per_node[prev] = min(min_answer_per_node[prev], winmin.min());      
  }                                                                                
  for (int i = 1; i <= N; ++i) {                                                   
    ans = max(ans, min_answer_per_node[i]);                                        
  }                                                                                
                                                                                   
  return ans;                                                                      
}                                                                                  
                                                                                   
// test driver                                                                     
int main() {                                                                       
  int N;                                                                           
  cin >> N;                                                                        
  vector<int> arr(N);                                                              
  for (int i = 0; i < N; ++i)                                                      
    cin >> arr[i];                                                                 
                                                                                   
  std::cout << optimal_solution(arr) << std::endl;                                 
}                                                                                  
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...