답안 #251089

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
251089 2020-07-20T06:21:59 Z puyu_liao Lightning Conductor (POI11_pio) C++14
27 / 100
132 ms 21008 KB
#include<bits/stdc++.h>
using namespace std;
#define int int64_t
const int N = 500005;
int h[N],ans[N];
int ftable[N],ftable2[N];
 
double f2(int i,int j){
    return ftable2[abs(i-j)];
}
 
int f(int i,int j){
    return ftable[abs(i-j)];
}
 
struct segment{
    int i,l,r;
};
 
void solve(int n){
    vector<segment> v;
    v.push_back({1,1,n});
    for(int i=2;i<=n;i++){
        segment now; now.i = i; now.l = i; now.r = n;
        //cout << i << " : "; for(auto i : v) cout << i.i << ' ' << complex<int>(i.l,i.r) << ' '; cout << '\n';
        while(now.l <= v.back().l && h[v.back().i] + f2(v.back().i,v.back().l) <= h[i] + f2(i,v.back().l)
        && h[v.back().i] + f2(v.back().i,v.back().r) <= h[i] + f2(i,v.back().r)){
            v.pop_back();
        }
        //cout << i << " : "; for(auto i : v) cout << i.i << ' ' << complex<int>(i.l,i.r) << ' '; cout << '\n';
        //cout << i << " : " << h[v.back().i] + f2(v.back().i,v.back().r) << ' ' << h[i] + f2(i,v.back().r) << '\n';
        if(h[v.back().i] + f2(v.back().i,v.back().r) >= h[i] + f2(i,v.back().r)) {
            if(v.back().r != n) v.push_back({now.i,v.back().r+1,now.r});
            continue;
        }
        auto pre = v.back();
        int l = max(v.back().l,now.l), r = v.back().r;
        //cout << i << " : " << l << ' ' << r << '\n';
        while(l < r){
            int m = l+r >> 1;
            if(h[pre.i] + f2(pre.i,m) > h[i] + f2(i,m)) l=m+1;
            else r = m;
        }
        now.l = l;
        v[v.size()-1].r = l-1;
        v.push_back(now);
    }
    for(auto i : v) for(int j=i.l;j<=i.r;j++) ans[j] = max(ans[j],h[i.i] + f(i.i,j));
}
 
int32_t main(){
    cin.tie(0); ios_base::sync_with_stdio(false);
    for(int i=1,now=1;i<N;i++){
        if(now*now<i) now++;
        ftable[i] = now;
      	ftable2[i] = sqrt(i);
        //if(i<10)cout << i << ' ' << ftable[i] << '\n';
    }
    int n;
    cin >> n;
    for(int i=1;i<=n;i++) cin >> h[i];
    solve(n);
    reverse(h+1,h+n+1);
    reverse(ans+1,ans+n+1);
    solve(n);
    reverse(ans+1,ans+n+1);
    reverse(h+1,h+n+1);
    for(int i=1;i<=n;i++) cout << ans[i] - h[i] << '\n'; //cout << '\n';
    // for(int i=1;i<=n;i++){
    //     int mx = 0;
    //     for(int j=1;j<=n;j++) mx = max(mx,h[j]+f(i,j));
    //     cout << mx-h[i] << ' ';
    // }cout << '\n';
}

Compilation message

pio.cpp: In function 'void solve(int64_t)':
pio.cpp:40:22: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
             int m = l+r >> 1;
                     ~^~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 8192 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 8192 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 8192 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 8952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 9472 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 9464 KB Output is correct
2 Correct 19 ms 9472 KB Output is correct
3 Incorrect 23 ms 9740 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 10180 KB Output is correct
2 Correct 40 ms 10104 KB Output is correct
3 Incorrect 29 ms 10744 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 12920 KB Output is correct
2 Correct 67 ms 12664 KB Output is correct
3 Incorrect 56 ms 13304 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 92 ms 17140 KB Output is correct
2 Correct 88 ms 15096 KB Output is correct
3 Incorrect 85 ms 17272 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 132 ms 20984 KB Output is correct
2 Correct 119 ms 18040 KB Output is correct
3 Incorrect 112 ms 21008 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 126 ms 18552 KB Output is correct
2 Correct 124 ms 18000 KB Output is correct
3 Incorrect 120 ms 20984 KB Output isn't correct