답안 #29586

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
29586 2017-07-20T07:35:02 Z 김동현(#1239) Lightning Conductor (POI11_pio) C++14
45 / 100
219 ms 13740 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 lll;
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){
		lll 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;
		lll 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 && cinv(v.back(), cur, 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:40:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(v.size() > f && v.back().a >= cur.a) return;
               ^
pio.cpp:41:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   while(v.size() > f && cinv(v.back(), cur, cur.b)) v.pop_back();
                  ^
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 13740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 13740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 13740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 13740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 13740 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 13740 KB Output is correct
2 Correct 16 ms 13740 KB Output is correct
3 Incorrect 23 ms 13740 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 13740 KB Output is correct
2 Correct 36 ms 13740 KB Output is correct
3 Incorrect 49 ms 13740 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 13740 KB Output is correct
2 Correct 66 ms 13740 KB Output is correct
3 Incorrect 103 ms 13740 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 156 ms 13740 KB Output is correct
2 Correct 106 ms 13740 KB Output is correct
3 Incorrect 116 ms 13740 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 219 ms 13740 KB Output is correct
2 Correct 183 ms 13740 KB Output is correct
3 Incorrect 196 ms 13740 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 196 ms 13740 KB Output is correct
2 Correct 186 ms 13740 KB Output is correct
3 Incorrect 173 ms 13740 KB Output isn't correct