0551-Icicles

問題概要

日本語なので略

解法

各つららにおいて長さが0になるまでの時間をa[x]とし,最初に全て0に初期化する.
次につららを長い順に見ていく.
長い順に見ているので,左右のつららを見てa[x+1]>0またはa[x-1]>0の場合はそのつららは,今見ているつららよりも長い.
よって,今見ているつららはmax(a[x+1],a[x-1])秒後に成長し始めることが分かるので,
a[x]=max(a[x+1],a[x-1])+L-つららの長さ
のようにして更新出来る.


全ての要素を見終わった後のaの要素の最大値が解となる.

実装(C++)

#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef pair<int,int> P;
P data[100000];
int a[100001];
int ans=0;
int N,L;
int main() {
	scanf("%d%d",&N,&L);
	for(int i=0;i<N;i++){
		int t;
		scanf("%d",&t);
		data[i].first=L-t;
		data[i].second=i;
	}
	std::sort(data,data+N);
	for(int i=0;i<N;i++){
		a[data[i].second+1]=max<int>(a[data[i].second],a[data[i].second+2])+data[i].first;
		ans=max(ans,a[data[i].second+1]);
	}
	printf("%d\n",ans);
	return 0;
}