Submission #563558

#TimeUsernameProblemLanguageResultExecution timeMemory
563558zxcvbnmLightning Conductor (POI11_pio)C++14
63 / 100
1094 ms65536 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

constexpr int nax = 500'005;

void self_max(int& me, int other) {
	me = max(me, other);
}

int lg[nax];
int mx[nax][19];

int q(int l, int r) {
	int L = lg[r-l+1];
	return max(mx[l][L], mx[r-(1<<L)+1][L]);
}


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n;
	cin >> n;
	vector<int> a(n);
	for(int& i : a) {
		cin >> i;
	}
	
	vector<int> ans(n, 0);
	
	lg[1] = 0;
	for(int i = 2; i < n; i++) {
		lg[i] = lg[i/2] + 1;
	}
	
	for(int i = 0; i < n; i++) {
		mx[i][0] = a[i];
	}
	
	for(int j = 1; j < 19; j++) {
		for(int i = 0; i < n; i++) {
			mx[i][j] = max(mx[i][j-1], mx[i+(1<<(j-1))][j-1]);
		}
	}
	
	//for(int i = 0; i < n; i++) {
		//for(int j = i; j < n; j++) {
			//cout << i << " " << j << ": " << q(i, j) << "\n";
		//}
	//}
	
	for(int i = 0; i < n; i++) {
		bool in = true;
		for(int p = 1; in; p++) {
			in = false;
			int sz = p*p;
			int prev = (p-1)*(p-1);
			// left interval
			int l = max(0, i-sz);
			int r = i - prev - 1;
			if (l <= r) {
				self_max(ans[i], p - a[i] + q(l, r));
				in = true;
			}
			
			// right inteval
			l = i + prev + 1;
			r = min(n-1, i + sz);
			
			//if (i == 0) {
				//cout << l << " " << r << "\n";
			//}
			
			if (l <= r && r < n) {
				self_max(ans[i], p - a[i] + q(l, r));
				in = true;
			}
		}
	}
	
	for(int i = 0; i < n; i++) {
		cout << ans[i] << "\n";
	}
}
#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...