답안 #248656

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
248656 2020-07-13T01:04:00 Z thecodingwizard Lightning Conductor (POI11_pio) C++11
45 / 100
356 ms 13432 KB
#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.pop();
            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;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 1156 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 1528 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 51 ms 1784 KB Output is correct
2 Incorrect 20 ms 1692 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 71 ms 2404 KB Output is correct
2 Correct 71 ms 2296 KB Output is correct
3 Incorrect 51 ms 2936 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 161 ms 5240 KB Output is correct
2 Correct 154 ms 4984 KB Output is correct
3 Incorrect 134 ms 5624 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 255 ms 9580 KB Output is correct
2 Correct 251 ms 7544 KB Output is correct
3 Incorrect 204 ms 9464 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 355 ms 13432 KB Output is correct
2 Incorrect 355 ms 10360 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 356 ms 10792 KB Output isn't correct
2 Halted 0 ms 0 KB -