#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
int n;
ll h[500010], la[500010], ra[500010];
struct CHT{
struct Cnv{ ll a, b; };
int cinv(Cnv p, Cnv q, ll y){
ll A = y - p.b, B = p.a, C = y - q.b, D = q.a;
if(A <= C && D >= B) return 1;
if(A >= C && D <= B) return 0;
ll E = A + C - (B - D) * (B - D);
if(A >= C){
if(E <= 0) return 1;
return E * E <= 4 * A * C;
}
else{
if(E < 0) return 0;
return E * E >= 4 * A * C;
}
}
ll iinv(Cnv p, ll y){
ll s = 0, e = 710;
while(s <= e){
ll m = (s + e) / 2;
if(m * m >= y - p.b) e = m - 1;
else s = m + 1;
}
return s + p.a;
}
vector<Cnv> v;
int f;
void ini(){ v.clear(); f = 0; }
void upd(ll a, ll b){
Cnv cur = {a, b};
if(v.size() > f && v.back().a >= cur.a) return;
while(v.size() > f + 1 &&
cinv(v.back(), v[int(v.size()) - 2], cur.b)) v.pop_back();
v.push_back(cur);
}
ll get(ll y){
if(f == v.size()) return 0;
while(int(v.size()) - f > 1 && cinv(v[f], v[f + 1], y)) f++;
return iinv(v[f], y);
}
} C;
void f(ll *a){
C.ini();
for(int i = 1; i <= n; i++){
a[i] = max(h[i], C.get(i));
C.upd(h[i], i);
}
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%lld", h + i);
f(la);
reverse(h + 1, h + n + 1);
f(ra);
reverse(h + 1, h + n + 1);
for(int i = 1; i <= n; i++) printf("%lld\n", max(la[i], ra[n + 1 - i]) - h[i]);
}
Compilation message
pio.cpp: In member function 'void CHT::upd(ll, ll)':
pio.cpp:39:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(v.size() > f && v.back().a >= cur.a) return;
^
pio.cpp:40:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(v.size() > f + 1 &&
^
pio.cpp: In member function 'll CHT::get(ll)':
pio.cpp:45:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(f == v.size()) return 0;
^
pio.cpp: In function 'int main()':
pio.cpp:60:17: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);
^
pio.cpp:61:50: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
for(int i = 1; i <= n; i++) scanf("%lld", h + i);
^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
13736 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
13736 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
13736 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
13 ms |
13736 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
16 ms |
13736 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
16 ms |
13736 KB |
Output is correct |
2 |
Correct |
23 ms |
13736 KB |
Output is correct |
3 |
Incorrect |
29 ms |
13736 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
43 ms |
13736 KB |
Output is correct |
2 |
Correct |
33 ms |
13736 KB |
Output is correct |
3 |
Incorrect |
43 ms |
13736 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
96 ms |
13736 KB |
Output is correct |
2 |
Correct |
89 ms |
13736 KB |
Output is correct |
3 |
Incorrect |
103 ms |
13736 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
166 ms |
13736 KB |
Output is correct |
2 |
Correct |
126 ms |
13736 KB |
Output is correct |
3 |
Incorrect |
116 ms |
13736 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
206 ms |
13736 KB |
Output is correct |
2 |
Correct |
216 ms |
13736 KB |
Output is correct |
3 |
Incorrect |
216 ms |
13736 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
276 ms |
13736 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |