CS Academy Max Even Subarray

リンク : https://csacademy.com/contest/archive/task/max-even-subarray/

 

問題概要

長さNの数列が与えられる。数列から連続した偶数個を取り出したときの最大値を求めよ。

 

解説

前から偶数個取り出した結果が負であれば、その次の2個を取り出すときは無視してよい。例 (2,-16,6,7) から[0,1]を取り出したとき 2-16<0 である。次の[2,3]を取り出すときは、[0,1]が負なら[0,3]は[2,3]より必ず小さくなる。

このことを使うと前から順番に線形時間で求めることができる。

 

実装でfor文で書こうとしたら条件を考えるのがめんどくさかったからwhileで書いた

 


    LL n,ans, sum[110000],a[110000];
int main() {
	cin >> n;
	rep(i, n) {
		cin >> a[i];
	}
	rep(i, n) {
		sum[i + 1] += sum[i] + a[i];
	}
	LL num = 0,i=0;
	ans = -INF;
	while(i*2+1<n){
		num += a[i * 2] + a[i * 2 + 1];
		ans = max(ans, num);
		if (num < 0)num = 0;
		i++;
	}
	num = 0, i = 0;
	while (i * 2 + 2 < n) {
		num += a[i * 2 + 1] + a[i * 2 + 2];
		ans = max(ans, num);
		if (num < 0)num = 0;
		i++;
	}
	cout << ans << endl;
	return 0;
}