D. Berserk Monsters

2024-01-27 17:44
文章标签 monsters berserk

本文主要是介绍D. Berserk Monsters,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Monocarp(又一次)在玩电脑游戏。你猜他在做什么?没错,杀死怪物。
一排有 n 个怪物,编号从 1 到 n。第 i 个怪物有两个参数:攻击值等于 ai,防御值等于 di。为了杀死这些怪物,Monoccarp给它们施了一个狂暴咒语,所以它们相互攻击,而不是Monocarp的角色。
这场战斗由 n 轮组成。每一轮,都会发生以下情况:
首先,每一个活着的怪物i都会对左边最近的活着的怪物(如果存在的话)和右边最接近的活着的怪兽(如果存在)造成 ai 伤害;
然后,每一个在这一轮中受到超过 dj 伤害的活着的怪物 j 都会死亡。
第 j 个怪物死亡,当且仅当其防御值 dj 严格小于本轮受到的总伤害时。
对于每一轮,计算在该轮中死亡的怪物数量。

输入
第一行包含一个整数t(1 ≤ t ≤ 1e4)——测试用例的数量。
每个测试用例由三行组成:第一行包含一个整数 n(1 ≤ n ≤ 3e5);第二行包含n个整数a1,a2,…,an(1 ≤ ai ≤ 1e9);第三行包含 n 个整数 d1,d2,…,dn(1 ≤ di ≤ 1e9)。
对输入的附加约束:所有测试用例的 n 之和不超过 3e5。

输出
对于每个测试用例,打印 n 个整数。第 i 个整数应该等于第 i 轮中死亡的怪物数量。

Input
3
5
3 4 7 5 10
4 9 1 18 1
2
2 1
1 3
4
1 1 2 4
3 3 4 2

Output
3 1 0 0 0 
0 0 
1 1 1 0 

注:
示例的第一个测试用例说明:

在第一轮中,会发生以下情况:
怪物1对怪物2造成3点伤害;
怪物2对怪物1和怪物3造成4点伤害;
怪物3对怪物2和怪物4造成7点伤害;
怪物4对怪物3和怪物5造成5点伤害;
怪物5对怪物4造成10点伤害;
怪物1不会死亡,因为它受到了4点伤害,防御为4点;
怪物2死亡,因为它受到10点伤害,防御为9点;
怪物3死亡,因为它受到9点伤害,防御为1;
怪物4没有死亡,因为它受到了17点伤害,防御是18点;
怪物5死亡,因为它受到5点伤害,防御为1。
第一轮过后,怪物1和4仍然活着。

在第二轮中,会发生以下情况:
怪物1对怪物4造成3点伤害;
怪物4对怪物1造成5点伤害;
怪物1死亡,因为它受到5点伤害,防御为4点;
怪物4不会死亡,因为它受到了3点伤害,防御是18点。

在接下来的三轮比赛中,只有第4个怪物还活着,所以什么也没发生。

解析:
容易想到记录每次活着的怪物的相邻项,再相加与d[i]比较,记录被杀死的个数,更新新的数列,不过这样做肯定超时!

第 i 轮被杀死的怪兽一定是上一轮被杀死的怪兽的相邻项,因为该项的上一轮相邻项的怪兽被杀,相邻项的数据产生了变动,否则上一轮杀不死它,这一轮还是杀不死它。
这样我们就只需要记录每次变动的且还没被杀死的相邻项怪兽,每次更新它们的相邻项即可。
 

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define ios ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int gcd(int a,int b) { return b? gcd(b,a%b) : a; }
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int n,m;
int a[N],d[N],l[N],r[N];
bool vis[N];
set <int> s,p;
void solve()
{cin>>n;for (int i=1;i<=n;i++) cin>>a[i];for (int i=1;i<=n;i++) cin>>d[i];for (int i=1;i<=n;i++){l[i]=i-1;r[i]=i+1;vis[i]=1;}r[n]=0;                                 //强调一下,初始化!!!s.clear(),p.clear();for (int i=1;i<=n;i++) s.insert(i);int m=n;while (m--){for (auto x:s){if (a[l[x]]+a[r[x]]>d[x]) {vis[x]=0;p.insert(x);}}cout<<p.size()<<" ";s.clear();for (auto x:p){l[r[x]]=l[x];                       //更新r[x]的左邻项r[l[x]]=r[x];                       //更新l[x]的右邻项if (vis[l[x]]) s.insert(l[x]);      //没被杀死的怪兽才可以进入下一轮if (vis[r[x]]) s.insert(r[x]);}p.clear();}cout<<endl;
}
signed main()
{ios;int T=1;cin>>T;while (T--) solve(); return 0;
}

这篇关于D. Berserk Monsters的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/651020

相关文章

「Pudding Monsters」Solution

简述题意 给定一个 n × n n \times n n×n 的棋盘,其中有 n n n 个棋子,每行每列恰好有一个棋子。 对于所有的 1 ≤ k ≤ n 1 \leq k \leq n 1≤k≤n,求有多少个 k × k k \times k k×k 的子棋盘中恰好有 k k k 个棋子,输出其总和。 n ≤ 3 × 1 0 5 n \le 3 \times 10^5 n≤3×

Educational Codeforces Round 161 (Rated for Div. 2)---->D. Berserk Monsters

一,思路: 1.这是一个模拟链表题,考察对链表的掌握和熟悉程度。在这这题当中有个坑点就是,当一个怪在这回合死了,他任然可以旁边的怪照成伤害(不能着急的给他删掉,不然会出问题)。 2.还有这题很容易就想到,暴力模拟但是时间复杂度:n^2级别是过不了的。所以要优化,找到循环当中那些步骤是冗余的。显然我们可以发现,当一只怪的在这回合没有死掉,且他左右两边的怪也没有死掉,那么下回合他肯定不会死掉。利用

Codeforce Monsters Attack!(B题 前缀和)

题目描述:    思路: 本人第一次的想法是先杀血量低的第二次想法是先搞坐标近的第三次想法看到数据量这么大, 我先加个和看看貌似我先打谁都行,由此综合一下, 我们可以把每一个不同的坐标当作一轮从最小的坐标开始,只要在当前轮数下,打死最靠近人物的怪物才行,每一轮以此类推。 说明所有F轮之前包括F轮能够攻击到角色的生命怪物血量值加起来<= F * k才行。 AC代码:  #

Mushroom Monsters - Fantasy RPG

蘑菇怪物PBR是一个2米高的生物。他可以摆出三种静态姿势中的任何一种,等待他的对手感到惊讶,或者他可以四处奔跑,攻击和施放法术,甚至冲锋。他用头撞击敌人,可以跳起来撞击他们,也可以低头直冲。他还有一个“魔法”攻击,扭动头部并切削。 使用混合形状功能将网格变形为无数外观,以进行大规模定制。 Infinity PBR是十多位艺术家共同努力的结果,每位艺术家都尽其所能。我想为独立游戏开发者制作最通用

Educational Codeforces Round 121 (Rated for Div. 2)-C. Monsters And Spells

题目链接 Monocarp is playing a computer game once again. He is a wizard apprentice, who only knows a single spell. Luckily, this spell can damage the monsters. The level he’s currently on contains n mons

CF1380D Berserk And Fireball 题解

CF1380D Berserk And Fireball CF1380D Berserk And Fireball 其实不能算一个构造题,主要难在代码实现。 考虑每一个区间,对于这个区间选择一个最优的方法删除即可。 显然我们考虑用当前区间最大的数去删除其他的数,之后再将其删除即可。 #include <bits/stdc++.h>using namespace std;//#

日常英语---十三、MapleStory/Monsters/Level 11-20

日常英语---十三、MapleStory/Monsters/Level 11-20 一、总结 一句话总结: MapleStory/Monsters/Level 11-20 — StrategyWiki, the video game walkthrough and strategy guide wikihttps://strategywiki.org/wiki/MapleStory/Monste

E. Monsters (hard version)

只做记录,不是题解 离开集训队好长时间了,也很长时间没有碰这些代码了,最近觉得码力掉了很多,决定操练起来。 ps 这bug调的整个人裂开,一瓶酒一包烟,一个算法写一天。 这调试的代码成功让他上了个百行,炸裂,感觉有一次可以解的算法,懒得想了,线段树+树状数组你俩辛苦下搁这磨吧。 #include<bits/stdc++.h>using namespace std;const

CF C. Monsters And Spells 思维

连接:传送门 题目描述: 题意:每次攻击可以是上一一时刻的攻击的伤害+1或者1(可以对着空气攻击),消耗的魔法等于每次攻击的伤害,n个怪物,每个怪物在ki时刻出现,血量为hi,在ki时刻打出的攻击必须不小于怪物的血量,问最少需要消耗多少魔法才可以杀死所有怪物? 分析:首先我们得知道在ki时刻打出的攻击必须大于等于hi。那么我们就只需要在打败这一时刻的怪物时,要不要再连续攻击保证下一时刻的攻击仍不小

日常英语---十一、MapleStory/Monsters/Level 201-210

日常英语---十一、MapleStory/Monsters/Level 201-210 一、总结 一句话总结: come from:MapleStory/Monsters/Level 191-200 — StrategyWiki, the video game walkthrough and strategy guide wikihttps://strategywiki.org/wiki/Map