[每日一题]:糖糖别胡说,我真的不是签到题目
题目:
考察点:
差分数组,思维。
分析:
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;
}
如果说年轻人未来是一场盛宴的话,那么我首先要有赴宴的资格。