可以发现,在每次发功后,从1到i都会加1,所以1到i其实他们的大小关系不变,所以我们可以离线做,把所有的发功都做完,然后从后到前进行扫描一遍就可以了。具体的就是用一个累加数组,从后到前,计算每个糖糖最终的b,可以知道,只有后面的糖糖对前面的有影响,所以我们从后到前,因为只有两个组,所以我们只需要记录目前的分别两个组的最大值,看看是否大于当前的b就可以记录最终剩下的值了
#include<bits/stdc++.h>
using namespace std;
int a[50005],b[50005],c[50010],sum[50010],Max[4];
int main()
{
//freopen("a.in","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
memset(sum,0,sizeof(sum));
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
int x;
for(int i=1;i<=m;i++) {scanf("%d",&x);sum[x]++;}
for(int i=n;i>=1;i--) sum[i]+=sum[i+1];
Max[0]=0,Max[1]=0;
int ans=n;
for(int i=n;i>=1;i--)
{
if(Max[a[i]^1]>b[i]+sum[i]) ans--;
Max[a[i]]=max(b[i]+sum[i],Max[a[i]]);
}
printf("%d\n",ans);
}
return 0;
}


京公网安备 11010502036488号