CF1901D Yet Another Monster Fight

GDKOI PJ DAY1 T2 原。

终于有时间来补题了。

还是考虑二分答案,因为他要求最大值最小。

然后考虑怎么检验,考虑求出 si=xai+1s_i=x-a_i+1 表示打死当前这个怪物的最慢的时刻。如果 si<is_i<i 则说明小于 ii 的位置都不可取,(因为题目要求用任意的攻击顺序,如果取了 ii 以前的话可以把 ii 以前的全部打完再来打 ii,但这不合法。)同理,如果 si>ni+1s_i>n-i+1,则说明大于 ii 的位置都不可取。

所以对每个怪物遍历求最后可以施展攻击的交集即可。

时间为 O(nlogn)O(n \log n)

#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;
}
posted @ 2024-01-20 07:21  June_Failure  阅读(9)  评论(0)    收藏  举报  来源