这题注意两点就行了
1、用后缀和处理发功的问题 然后在把能力值加上这发功的
2、反方向跑一遍能力值 当前的糖糖不被消灭的要求是后面同组的最大值小于他
详细看代码理解
#include <bits/stdc++.h>
#define ll long long
int const N=5e4+5;
using namespace std;
int n,t,m,cnt[N];
struct T{
int x,y;
}a[N];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y,cnt[i]=0;
for(int i=1;i<=m;i++){
int q;cin>>q;
cnt[q]++;
}
int max0=-1,max1=-1;
int ans=0;
for(int i=n;i>0;i--){
cnt[i]+=cnt[i+1];///后缀和
a[i].y+=cnt[i];///更新当前糖糖的能力值
if(a[i].x==0){///组别为0
if(a[i].y>=max1) ans++;///后面1组的最大值是否大于
max0=max(max0,a[i].y);///更新组别0的最大值
}
else
{
if(a[i].y>=max0) ans++;///后面0组的最大值是否大于
max1=max(max1,a[i].y);///更新组别1的最大值
}
}
cout<<ans<<endl;
memset(cnt,n,sizeof(cnt));///清空后缀数组
}
return 0;
}

京公网安备 11010502036488号