糖糖别胡说,我真的不是签到题目
- 先假设所有人都不会被消灭,求出第n秒的所有人的战力
- 从后往前遍历,分别记录两个队的战力最大值,如果第i个人的战力小于后面另一个队的最大战力值,则一定会被消灭
#include<bits/stdc++.h>
using namespace std;
#define ll long long //能力值要用long long
#define mm(a,x) memset(a,x,sizeof(a))
const int maxn=50005;
struct Node{
int x;ll y;
}a[maxn];
ll b[maxn];
int main(){
int t,n,m,x;cin>>t;
while(t--){
mm(b,0);//每次b数组要清空
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
for(int i=1;i<=m;i++) cin>>x,b[x]++;
for(int i=n;i>=1;i--) b[i]+=b[i+1],a[i].y+=b[i];//b数组转换为后缀数组
ll max0=0,max1=0;int ans=0;
for(int i=n;i>=1;i--){
if(a[i].x==0){
max0=max(max0,a[i].y);
if(max1>a[i].y) ans++;
}
if(a[i].x==1){
max1=max(max1,a[i].y);
if(max0>a[i].y) ans++;
}
}
cout<<n-ans<<"
";
}
return 0;
}