CF1901D Yet Another Monster Fight
GDKOI PJ DAY1 T2 原。
终于有时间来补题了。
还是考虑二分答案,因为他要求最大值最小。
然后考虑怎么检验,考虑求出 表示打死当前这个怪物的最慢的时刻。如果 则说明小于 的位置都不可取,(因为题目要求用任意的攻击顺序,如果取了 以前的话可以把 以前的全部打完再来打 ,但这不合法。)同理,如果 ,则说明大于 的位置都不可取。
所以对每个怪物遍历求最后可以施展攻击的交集即可。
时间为 。
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
#define int long long
int a[N],n;
bool check(int x){
int l=1,r=n;
for(int i=1;i<=n;i++){
if(x<a[i]) return false;
int lst=x-a[i]+1;
if(lst<i) l=max(l,i);
if(lst<n-i+1) r=min(r,i);
}
if(l<=r) return true;
return false;
}
void Find(){
int l=1,r=2e9,ans=0;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)) ans=mid,r=mid;
else l=mid+1;
}
cout<<ans<<endl;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
Find();
return 0;
}