Particle

競技プログラミングについての雑記

AOJ 0551: Icicles

つらら

汚いです。
やるだけで、実装が(自分にとっては)難しい問題だと思ったけど、考える問題らしい。余裕があるときに解きなおしたい。
long使う必要なかったかも。面倒臭いから全部longにしちゃったけど。

long n,l,ice[100002],ict[100002],icf[100002],irs[100002];
long tp[100002];

int main(){
	int f = 0;
	cin>>n>>l;
	for(int i = 1; i <= n; i++){
		cin>>ice[i];
	}
	for(int i = 1; i <= n; i++){
		ict[i] = l - ice[i];
	}
	for(int i = 1; i <= n; i++){
		icf[i] = ((ice[i]<ice[i-1]) << 1) + (ice[i]<ice[i+1]);
	}
	for(int i = 1; i <= n; i++){
		if(!icf[i]){
			irs[i] = ict[i];
			tp[f] = i;
			f++;
		}
	}
	for(int i = 0; i < f; i++){
		icf[tp[i]-1] &= ~1;
		icf[tp[i]+1] &= ~2;
		tp[i] = 0;
	}
	while(f){
		f = 0;
		for(int i = 1; i <= n; i++){
			if(!irs[i] && !icf[i]){
				if(ice[i]<ice[i-1] && ice[i]<ice[i+1]){
					irs[i] = ict[i] + max(irs[i-1],irs[i+1]);
				}else {
					irs[i] = ict[i] + (ice[i-1]>ice[i+1] ? irs[i-1] : irs[i+1]);
				}
				tp[f] = i;
				f++;
			}
		}
		for(int i = 0; i < f; i++){
			icf[tp[i]-1] &= ~1;
			icf[tp[i]+1] &= ~2;
			tp[i] = 0;
		}
	}
	long r = 0;
	for(int i = 1; i <= n; i++){
		r = max(r,irs[i]);
	}
	cout<<r<<endl;
	return 0;
}