Solution:
如果直接从前往后,则后面的又会影响到之前到,所有干脆从后往前考虑,这样就不会对之前计算到的造成影响。
从后往前维护两个队伍各自的最大值和会被增加的战斗力,如果前面的战斗力小于另一个战队的当前最大值,则被消灭,保证了每个人只会被计算一次。
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef long long ll;
const ll N = 2e5 + 5;
pair<int, ll> p[N];
ll t, n, m, b[N];
int main() {
cin >> t;
while (t--) {
memset(b, 0, sizeof(b));
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> p[i].x >> p[i].y;
for (int i = 1; i <= m; i++) {
int x;
cin >> x;
b[x]++;
}
ll ma0 = 0, ma1 = 0, res = 0;
for (int i = n; i >= 1; i--) {
b[i] += b[i + 1];
p[i].y += b[i];
if (p[i].x) {
ma1 = max(ma1, p[i].y);
if (p[i].y < ma0) res++;
} else {
ma0 = max(ma0, p[i].y);
if (p[i].y < ma1) res++;
}
}
cout << n - res << '\n';
}
return 0;
}

京公网安备 11010502036488号