描述
题解
这道题数据比较水,可以直接爆破(代码One)。
也可以先预处理一下每个高度的炮弹能轰炸的位置,接下来逐个轰炸更新状态即可(代码Two)。
也可以用线段树解,是个不错的题。
代码
One:
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAXN = 5e4 + 10;
int A[MAXN];
int main(int argc, const char * argv[])
{
int M, N;
cin >> M >> N;
int maxPos = 0;
for (int i = 0; i < M; i++)
{
scanf("%d", A + i);
if (A[i] > A[maxPos])
{
maxPos = i;
}
}
int B;
for (int i = 0; i < N; i++)
{
scanf("%d", &B);
if (B <= A[0] || B > A[maxPos])
{
continue;
}
for (int i = 0; i < M; i++)
{
if (A[i] >= B)
{
A[i - 1]++;
break;
}
}
}
for (int i = 0; i < M; i++)
{
printf("%d\n", A[i]);
}
return 0;
}
Two:
#include <iostream>
#include <cstdio>
#define repe(i, a, n) for (int i = a; i <= n; i++)
using namespace std;
typedef long long LL;
const int MAXN = 5e4 + 10;
const int MAXM = 1e6 + 10;
int a[MAXN], b[MAXN], p[MAXM];
int main()
{
int n, m, mx = 0;
cin >> n >> m;
repe(i, 1, n)
{
scanf("%d", a + i);
}
repe(i, 1, m)
{
scanf("%d", b + i);
mx = max(mx, b[i]);
}
int s = 1;
// 预处理不同高度炮弹的轰炸点
repe(i, 1, mx)
{
while (s <= n && a[s] < i)
{
s++;
}
p[i] = s - 1;
}
// 逐个遍历轰炸更新状态
repe(i, 1, m)
{
int v = p[b[i]];
if (0 == v || n == v)
{
continue;
}
a[v]++;
p[a[v]] = min(p[a[v]], v - 1);
}
repe(i, 1, n)
{
printf("%d\n", a[i]);
}
return 0;
}