我真的不是签到题

注意:被消灭的糖糖依旧可以增加bi值

具体思路就是先让她把技能都释放完,然后求最终的每个糖糖的bi值(用到了差分),然后从后往前遍历同时维护两个组的最大值,当某个其他组的值小于对应组的最大值时,表明这个糖糖会被消灭

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<stack>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N=5e4+10;
int a[N],b[N],c[N];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        memset(c,0, sizeof c);
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i],&b[i]);
            c[i]=b[i]-b[i-1];//差分 
        }
        for(int i=0;i<m;i++){
            int x;
            scanf("%d",&x);
            c[1]++; //差分相加 
            c[x+1]--;
        }
        for(int i=1;i<=n;i++){
            c[i]=c[i]+c[i-1]; // 差分复原 
        }
        int max1=-1;
        int max0=-1;
        int sum=n;
        for(int i=n;i>=1;i--){
            if(a[i]==1){
                if(c[i]<max0) sum--;
                max1=max(max1,c[i]);
            }
            else{
                if(c[i]<max1) sum--;
                max0=max(max0,c[i]);
            }
        }
        cout<<sum<<'\n';
    }
}