题意
传送门 NC 14583
题解
差分数组维护发功增加的能力值,从后向前维护 2 2 2 组中的最大能力值,依序减去消灭的糖糖数即可。
#include <bits/stdc++.h>
using namespace std;
#define maxn 50005
typedef long long ll;
ll n, m;
ll a[maxn], b[maxn], d[maxn];
void solve()
{
ll res = n;
for (int i = 1; i <= n; i++)
{
d[i] += d[i - 1];
b[i] += d[i];
}
ll max0 = -1, max1 = -1;
for (int i = n; i >= 1; i--)
{
if (a[i] == 0 && b[i] < max1)
{
res--;
}
if (a[i] == 1 && b[i] < max0)
{
res--;
}
if (a[i])
{
max1 = max(max1, b[i]);
}
else
{
max0 = max(max0, b[i]);
}
}
printf("%lld\n", res);
}
int main()
{
ll t;
scanf("%lld", &t);
while (t--)
{
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf("%lld%lld", a + i, b + i);
}
memset(d, 0, sizeof(d));
for (int i = 1; i <= m; i++)
{
ll c;
scanf("%lld", &c);
d[1]++;
d[c + 1]--;
}
solve();
}
}