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; }