题意:n只糖糖分为二组做游戏,排成一排,第i只糖糖有能力值bi,从第i秒的时候,第i只糖糖就可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的糖糖。糖糖的爸爸,娇姐,会发功m次,第i次发功的时间为ci,则在第ci秒结束后,b1,b2,.....,bci都会增加1,现在,娇姐想知道在第n秒后,会有多少只糖糖存活下来。

思路:逆向模拟

代码:

#include<bits/stdc++.h>

using namespace std;
#define ll long long
#define inf 1000000007

int a[100005], b[100005], f[1000005];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(f,0,sizeof(f));
        int n, m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&a[i],&b[i]);
        }
        for(int i=0;i<m;i++)
        {
            int c;
            scanf("%d",&c);
            f[c]++;
        }
        int ma=-1, mb=-1;
        int k=0, jia=0;
        for(int i=n;i>=1;i--)
        {
            jia+=f[i];
            b[i]=b[i]+jia;
            if(a[i]==0)
            {
                if(b[i]<mb)
                {
                    k++;
                }
                if(b[i]>ma)
                {
                    ma=b[i];
                }
            }
            else
            {
                if(b[i]<ma)
                {
                    k++;
                }
                if(b[i]>mb)
                {
                    mb=b[i];
                }
            }
        }
        printf("%d\n",n-k);
    }
    return 0;
}