Educational Codeforces Round 158 (Rated for Div. 2) D. Yet Another Monster Fight

该篇文章描述了解决一个编程问题的方法,涉及在一个怪物分布的数组中找到施放法术的位置,使得从该位置开始,两边剩余怪物被消灭所需的最小威力之和最小。通过构建左右两个数组并使用二分查找确定最小威力。
摘要由CSDN通过智能技术生成

链接:Problem - D - Codeforces

思路:在某一个位置施法后 这个位置左边的每个位置所需的威力应该为 右边所有怪物都被打掉之后再打自己 右边同理 所以开两个数组 L一个记录在当前位置左边施法后 左边的所有怪物都被打掉之后需要多少威力才能打掉自己 另一个R记录在当前位置右边施法后 右边的所有怪物都被打掉之后需要多少威力才能打掉自己 然后再开两个数组 记录当前位置左边最大的R 和当前位置右边最大的L 即我左边到它位置右边都被打掉之后所需的威力的最大值和右边到它位置左边都被打掉之后所需的威力的最大值 二分答案 二分威力mid 然后在每一个位置查看 是否存在一个位置在释放mid威力之后 左边和右边需要最大威力的那个怪物都能被打掉

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;using ll = long long;using PLL = pair<ll,ll>;
const ll MAX = 1e18;const ll MIN = -1e18;const ll INF=0x3f3f3f3f;
const ll Q = 3e5+9;const ll MOD = 1e9 + 7;
ll a[Q],l[Q],r[Q],lcnt[Q],rcnt[Q];ll n;
bool check(ll x){
	
	for (ll i = 1; i <= n; i++)
	{
		if(rcnt[i-1]<=x and lcnt[i+1]<=x and x>=a[i]) return true;
	}
	
	return false;
	
}
void solve(){
   cin>>n;
   for (ll i = 1; i <= n; i++)
	{
		cin>>a[i];
	}
	for (ll i = 1; i <= n; i++)
	{
		l[i]=(i-1)+a[i];
	}
	for (ll i = 1; i <= n; i++)
	{
		r[i]=(n-i)+a[i];
	}
	for (ll i = n; i >= 1; i--)
	{
		lcnt[i]=max(lcnt[i+1],l[i]);
	}
	for (ll i = 1; i <= n; i++)
	{
		rcnt[i]=max(rcnt[i-1],r[i]);
	}
   ll l=1,r=MAX;ll ans=0;
   while(l<=r){
	ll mid=(l+r)>>1;
	if(check(mid)){
		r=mid-1;ans=mid;
	}else{
		l=mid+1;
	}
   }
cout<<ans;
}
int main(){
	ios;ll _=1;//cin>>_;
	while (_--)solve();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值