[每日一题]:糖糖别胡说,我真的不是签到题目

题目:

考察点:

差分数组,思维。

分析:

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;
}
posted @ 2020-04-20 23:10  IceSwords  阅读(229)  评论(0编辑  收藏  举报