牛客枚举暴力题---糖糖别胡说,我真的不是签到题目

糖糖别胡说,我真的不是签到题目

  • 先假设所有人都不会被消灭,求出第n秒的所有人的战力
  • 从后往前遍历,分别记录两个队的战力最大值,如果第i个人的战力小于后面另一个队的最大战力值,则一定会被消灭
#include<bits/stdc++.h>

using namespace std;

#define ll long long //能力值要用long long 
#define mm(a,x) memset(a,x,sizeof(a))
const int maxn=50005;

struct Node{
	int x;ll y;
}a[maxn];
ll b[maxn];
int main(){
    int t,n,m,x;cin>>t;
    while(t--){
    	mm(b,0);//每次b数组要清空
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
    	for(int i=1;i<=m;i++) cin>>x,b[x]++;
	for(int i=n;i>=1;i--) b[i]+=b[i+1],a[i].y+=b[i];//b数组转换为后缀数组
	ll max0=0,max1=0;int ans=0;
	for(int i=n;i>=1;i--){
		if(a[i].x==0){
			max0=max(max0,a[i].y);
			if(max1>a[i].y) ans++;
		}
		if(a[i].x==1){
			max1=max(max1,a[i].y);
			if(max0>a[i].y) ans++;
		}
	}
		cout<<n-ans<<"\n";	
	}
    return 0;
}
posted @ 2020-06-19 21:14  chstor  阅读(123)  评论(0编辑  收藏  举报