首页 > 其他分享 >D. Yet Another Monster Fight

D. Yet Another Monster Fight

时间:2023-12-11 16:45:52浏览次数:26  
标签:r1 最大值 Yet 怪物 Another 节点 300005 Fight ll

原题链接

1.导论

这道题能不能用贪心做?答案是不能,具体为什么已经有题解给出回答。当贪心无法求解时,我们考虑一下动态规划。

2.算法设计

对于任一节点,其最坏情况(即所需最大起始威力值,后文称最大值)是什么?

当第一个被攻击的怪物(以下称头怪物)在其右边时,其最大值为右边怪物的数量加上自身初始值,头怪物在左边时同理。

因此我们可以考虑\(o(n^2)\)的做法,遍历一遍序列为头节点,再遍历一遍序列找出其余节点对应的最大值即可。

3.算法改进

遗憾的是,n最大达到了\(3\cdot 10^5\),因此我们要考虑优化程序。

我们发现,任一节点的最大值是由它和头怪物的位置关系决定的。

假设\(a[i]\)为头怪物,其左边节点的最大值为\(r[j],j\in[1,i-1]\),右边节点的最大值为\(l[j],j\in[i+1,n]\),因此我们可以正序倒序遍历一遍序列,求出每个点作为头怪物时左右节点的最大值。设\(l1[i]\)为左边节点的最大值,\(r1[i]\)为右边节点的最大值。

状态转移方程为:

\(l1[i]=max(l1[i-1],r[i-1])\)
\(r1[i]=max(r1[i+1],l[i+1])\)

4.代码呈现

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[300005]={0};//代表每个元素的初始值
ll l[300005]={0};//假如头怪物在左边的最坏情况,即左边所有怪物都清空了闪电才劈过来
ll r[300005]={0};
ll l1[300005]={0};//当前怪物为头怪物时,左边的最大值
ll r1[300005]={0};
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        l[i]=a[i]+i-1;
        r[i]=a[i]+n-i;
    }
    ll ans=3e9;
    for(int i=1;i<=n;i++) l1[i]=max(l1[i-1],r[i-1]);//由于头怪物在他们的右方,所以左边怪物的最大值等于把右边怪物都清空后的最坏情况
    for(int i=n;i>=1;i--) r1[i]=max(r1[i+1],l[i+1]);
    for(int i=1;i<=n;i++) ans=min(ans,max(max(l1[i],r1[i]),a[i]));//左边最大值,右边最大值,和自己
    cout<<ans;
    return 0;
}

标签:r1,最大值,Yet,怪物,Another,节点,300005,Fight,ll
From: https://www.cnblogs.com/pure4knowledge/p/17894748.html

相关文章

  • B. YetnotherrokenKeoard
    一道数据结构题。这题需要用到两个栈分别存储大写字母和小写字母以配合删除操作。主要代码:#include<bits/stdc++.h>usingnamespacestd;typedefpair<char,int>Pos;intmain(){intn;cin>>n;while(n--){vector<Pos>a,b;strings,s1;......
  • idea报错:XXX already exist in project. Please, specify another name.
    问题:idea报错:XXXalreadyexistinproject.Please,specifyanothername.并且左侧目录中并没有看见同名存在文件解决方法:1.打开File->ProjectStructure2.点击Modules->找到报错说存在的模块->点击减号删除->Apply->OK反思问题为什么存在应该是我在系统文件夹中之......
  • [机翻]Fun With Another PG-Compliant Hook/另一个符合 PG 标准的钩子的乐趣
    原文链接:https://revers.engineering/fun-with-pg-compliant-hook/目录Overview/概述CommonHookPointsinWindowsKernel/Windows内核中的常见钩子点TheHalPrivateDispatchTableTargetDiscovery/目标发现DIY…MOSTLYDIY.../主要δLocatingHalPrivateDispatchTable/......
  • DASCTF X CBCTF 2023 yet another sandbox
    本来想直接复现昨天的DASCTF,但是前面的一个DASCTF已经开始看了,那就放到下次再写。yetanothersandboxjs沙箱逃逸。下载复现获得一个c写的readflag,有个js的模块文件app.mjs:importexpressfrom'express';importpathfrom'path';const__dirname=path.resolve();......
  • [Codeforces] CF1703F Yet Another Problem About Pairs Satisfying an Inequality
    时间限制\(2s\)|空间限制\(250M\)题目描述给你一个序列$a_1,a_2,\dotsa_n$。请计算出满足下面条件的$(i,j)(1\leqi,j\leqn)$个数。$a_i<i<a_j<j$.输入格式第一行包含一个整数$t$($1\leqt\leq1000$)—测试数据的个数每一个......
  • [Codeforces] CF1719C Fighting Tournament
    题目传送门另:多测不清空,WA两行泪题意Burenka正准备去观看一年中最有趣的体育活动——她朋友Tonya组织的格斗锦标赛。有n名运动员参加了大赛,标号分别为为1,2,...,n。第i名运动员的实力是\(a_i(1\lea_i\len)\)。每个运动员的实力是不同的,也就是说,数组a是n的一种......
  • [Codeforces] CF1858C Yet Another Permutation Problem
    YetAnotherPermutationProblem-洛谷这题本来很简单,思路我也想到了,但是代码一直没写对,思路也一直换来换去(悲然而发现最开始的思路是对的题意Alex收到了一个名为"GCD排列"的游戏作为生日礼物。这个游戏的每一轮进行如下操作:首先,Alex选择一个整数序列\(a_1,a_2,…,a_......
  • CF1858C Yet Another Permutation Problem
    CF1858CYetAnotherPermutationProblemYetAnotherPermutationProblem-洛谷这题本来很简单,思路我也想到了,但是代码一直没写对,思路也一直换来换去(悲然而发现最开始的思路是对的题意Alex收到了一个名为"GCD排列"的游戏作为生日礼物。这个游戏的每一轮进行如下操作:......
  • CF1719C Fighting Tournament
    FightingTournament题目传送门另:多测不清空,WA两行泪题意Burenka正准备去观看一年中最有趣的体育活动——她朋友Tonya组织的格斗锦标赛。有n名运动员参加了大赛,标号分别为为1,2,...,n。第i名运动员的实力是$a_i(1\lea_i\len)$。每个运动员的实力是不同的,也就是说,数......
  • [题解] CF1748E Yet Another Array Counting Problem
    YetAnotherArrayCountingProblem给你一个长度为\(n\)的序列和一个数\(m\),求有多少个长度为\(n\)的序列\(b\)满足:\(\foralli\in[1,n],b_i\in[1,m]\)。对于每个区间\([l,r]\),\(b\)中最大值最靠左的位置和\(a\)相同。\(n,m\le2\times10^5,n\ti......