Submission #961873

#TimeUsernameProblemLanguageResultExecution timeMemory
961873garamlee500Hacker (BOI15_hac)C++17
100 / 100
180 ms41760 KiB
#include <iostream> using namespace std; int nums[500000]; //int sums[500000]; // 0 to 8388606 for root/internal // 8388607 + x for leaves int sums[16777215]; int n, k; int getItem(int i){ return nums[i%n]; } int query(int l, int r, int i = 0, int x = 0, int y =8388607){ if (l==x&&y==r){ return sums[i]; } int result= 1000000001; int mid = (x+y+1)/2; if (l < mid){ result = min (result, query(l, min(r, mid-1), 2*i+1, x, mid-1)); } if (r >= mid){ result = min(result, query(max(l, mid), r, 2*i+2, mid, y)); } return result; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n; for (int i = 0; i < n; i++){ cin >> nums[i]; } // Bytesar gets worst set of adjacent n/2 + n%2 k = n/2 + n%2; sums[0+8388607]=0; // sums starting at i, up to i + k-1 for (int i = 0; i < k; i++){ sums[0+8388607] += nums[i]; } for (int i = 1; i < n; i++){ sums[i+8388607] = sums[i-1+8388607]; sums[i+8388607] += getItem(i+k-1) - getItem(i-1); //cout << sums[i+8388607] << endl; } for (int i = 8388606; i>=0; i--){ sums[i] = min(sums[2*i+1], sums[2*i+2]); } int best = 0; for (int i = 0; i < n; i++){ // starts can be anywher from i-k+1, to i; int start = i-k+1; int last= i, minimum; if (start < 0){ minimum = min( query((start+n)%n, n-1), query(0, last) ); } else{ minimum = query(start, last); } best = max(best, minimum); } cout << best << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...