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