二分探索する。
bool ascending(vector<lli> H)
{
for (int i = 1; i < H.size(); ++i) {
if (H[i - 1] < H[i]) continue;
return false;
}
return true;
}
bool solve(vector<lli> H, lli x)
{
H[0] = max(1LL, H[0] - x);
for (int i = 1; i < H.size(); ++i) {
if (H[i - 1] < H[i]) {
H[i] = max(H[i - 1] + 1, H[i] - x);
} else {
H[i] = min(H[i - 1] + 1, H[i] + x);
}
}
return ascending(H);
}
class KingdomAndTrees {
public:
int minLevel(vector <int> H_)
{
vector<lli> H;
for (int i = 0; i < H_.size(); ++i) {
H.push_back(H_[i]);
}
if (ascending(H)) return 0;
lli small = 0, large = 1000000000;
while (small + 1 < large) {
lli mid = (small + large) / 2LL;
if (solve(H, mid)) large = mid;
else small = mid;
}
return large;
}
};