这题注意两点就行了
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; }