题目:

考察点:

差分数组,思维。

分析:

Code:

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

#define x first
#define y second

#define INF 0x3f3f3f3f

using namespace std;

typedef long long LL;

typedef pair<int,int>PII;

const int maxn = 5e6 + 10;

struct node {
    int id,value;
} cow[maxn];

int c[maxn],d[maxn];

int t,n,m;

int main(void) {
    scanf("%d",&t);
    while(t --) {
        // 多组测试样例,每次都需要初始化 差分数组 
        memset(d,0,sizeof(d));
        scanf("%d%d",&n,&m);
        for(int i = 1; i <= n; i ++) {
            scanf("%d%d",&cow[i].id,&cow[i].value);
        }
        // 进行区间操作 
        for(int i = 1; i <= m; i ++) {
            scanf("%d",&c[i]);
            d[1] ++,d[c[i] + 1] --;
        }
        int s = 0;
        // 得到发功后的新 B[i] 
        for(int i = 1; i <= n; i ++) {
            s += d[i];
            cow[i].value += s; 
        }
        int ans = 0;
        int max1 = -1,max2 = -1;
        for(int i = n; i >= 1; i --) {
            if(cow[i].id) {
                max1 = max(max1,cow[i].value);
                // 说明无法干掉 
                if(cow[i].value >= max2) {
                    ans ++;
                }
            } else {
                max2 = max(max2,cow[i].value);
                if(cow[i].value >= max1) {
                    ans ++;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}