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 @   June_Failure  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示