SRM518 Div1 Medium - ConvexSequence
問題
長さnの数列aに対して「好きな要素を1減らす」という操作を行い、[1,n-2]の任意のiで a[i-1]+a[i+1]<=2a[i] が成り立つようにしたい
最低何回操作が必要か求める
解法
両端は操作しても損しかしないから考えなくていい
1<=i<=n-2の範囲を手前から見ていき、条件を満たしていない場合、要素を減らすことはできても増やすことはできないので、条件を満たすまでa[i]を減らし続けるしかない
a[i]で条件を満たすように減らすと今度はa[i-1]で条件を満たさなくなることもあるから、更新が止まるまでループ
最悪何回くらいループするか見積もりができてないままこれで出して通しちゃった
未だにわからないんだけどこれTLEさせるケースはあるのか?🤔あんまり解けた気がしてない
class ConvexSequence { public: ll getMinimum(vector<int> a) { ll n = a.size(), res = 0; while (1) { bool b = 0; reps(i,1,n-1) { ll t = max(0, (a[i]*2-a[i-1]-a[i+1]+1)/2); res += t, a[i] -= t, b += t; } if (!b) break; } return res; } };