我真的不是签到题
注意:被消灭的糖糖依旧可以增加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';
}
}

京公网安备 11010502036488号