Submission #248658

#TimeUsernameProblemLanguageResultExecution timeMemory
248658thecodingwizardLightning Conductor (POI11_pio)C++11
45 / 100
377 ms13260 KiB
#include <bits/stdc++.h> using namespace std; const int inf = 1e9+10; struct func { int h, i, l, r; }; int n; int mx[500000]; int mx2[500000]; int H[500000]; int Sqrt[500000]; int eval(func f, int i) { return f.h+Sqrt[i-f.i]; } // returns when right part of func a intersects func b int intersectRight(func a, func b) { if (eval(a, n) >= eval(b, n)) return inf; long long d = b.h-a.h; if (b.i-a.i-d*d<0) return -1; long double x = (b.i-a.i)/2.0/d-d/2.0; long long ans = ceil(x*x-0.001)+b.i; assert(ans < n); return ans; } void solveRight(int mx[]) { stack<func> s; for (int i = 0; i < n; i++) { func f = {H[i], i, i, n-1}; while (!s.empty()) { func f2 = s.top(); int intersect = intersectRight(f2, f); //cout << f2.i << " intersects " << f.i << " at " << intersect << endl; if (intersect <= f2.l) { s.top().r = f.l-1; break; } else { if (intersect - 1 <= n-1) s.top().r = intersect - 1; f.l = intersect; break; } } if (f.l <= n-1) s.push(f); assert(f.l >= i); } while (!s.empty()) { func f = s.top(); s.pop(); //cout << f.i << " is max from " << f.l << " to " << f.r << endl; for (int i = f.l; i <= f.r; i++) mx[i] = max(mx[i], eval(f, i)); } for (int i = 0; i < n; i++) { //cout << "mx[" << i << "] = " << mx[i] << endl; } } int main() { cin >> n; Sqrt[0] = 0; for (int i = 1; i <= 1000; i++) { for (int j = (i-1)*(i-1)+1; j <= min(i*i, n-1); j++) Sqrt[j] = i; } for (int i = 0; i < n; i++) { cin >> H[i]; mx[i] = H[i]; } solveRight(mx); for (int i = 0; i < n/2; i++) { swap(H[i], H[n-i-1]); } solveRight(mx2); for (int i = 0; i < n; i++) { mx[i] = max(mx[i], mx2[n-1-i]); } for (int i = 0; i < n/2; i++) { swap(H[i], H[n-i-1]); } for (int i = 0; i < n; i++) { cout << mx[i]-H[i] << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...