思路:每一轮攻击后,只有死亡的怪兽左边或右边的怪兽在下一轮受到的攻击会变化,其他怪兽受到的攻击不会变,因此用一个live数组存在下一轮受到攻击有变化的怪兽,vis数组标记每个怪兽在哪一轮死亡或者在哪一轮被存到live数组中(防止一个被重复放到live数组中)
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define lson p << 1
#define rson p << 1 | 1
const int maxn = 1e6 + 5, maxm = 2e3 + 5;
int a[maxn], b[maxn], d[maxn];
int n, m;
int vis[maxn], L[maxn], R[maxn];
// int sum[maxn], ans[maxn];
void solve()
{
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
for(int i = 1; i <= n; i++){
cin >> d[i];
}
vector<int> live;
for(int i = 1; i <= n; i++){
vis[i] = 0;
live.pb(i);
L[i] = i - 1;
R[i] = i + 1;
}
a[0] = d[0] = a[n + 1] = d[n + 1] = 0;
for(int i = 1; i <= n; i++){
vector<int> die;
for(auto x : live){
if(a[L[x]] + a[R[x]] > d[x]){
die.pb(x);
vis[x] = i;
}
}
live.clear();
for(auto x : die){
R[L[x]] = R[x];
L[R[x]] = L[x];
if(L[x] && vis[L[x]] < i){
live.pb(L[x]);
vis[L[x]] = i;
}
if(R[x] <= n && vis[R[x]] < i){
live.pb(R[x]);
vis[R[x]] = i;
}
}
cout << die.size() << ' ';
}
cout << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
cin >> T;
while (T--)
{
solve();
}
}
本文描述了一个关于怪兽攻击的问题,通过C++代码实现,利用live数组记录下一轮可能受到攻击变化的怪兽,vis数组跟踪怪兽状态。程序计算每轮被消灭怪兽的数量,适用于IT技术中的算法和数据结构部分。
1339

被折叠的 条评论
为什么被折叠?



