解析
1.前m次操作可以用前缀和模拟区间加,得到每个糖糖的新能力值后从后往前维护每个队伍的最大值,当前糖糖的能力值如果大于后面敌对队伍糖糖的最大值,也就是比后面的糖糖都强,那么他存活,反之白给。复杂度θ (n)。2.如果从前往后判断第i糖糖能不能存活,还要搜索后面i-1个糖糖,复杂度θ (n^2)。
代码
#include<bits/stdc++.h>
using namespace std;
int mx[2],sum[50005],b[50005],team[50005],n,m,t,c;
int main(void) {
cin>>t;
while(t--) {
cin>>n>>m;
memset(sum,0,sizeof sum);
for(int i=1;i<=n;++i) cin>>team[i]>>b[i];
for(int i=1;i<=m;++i) {
cin>>c;
++sum[c];
}
mx[team[n]]=b[n]+sum[n]; mx[team[n]^1]=0;
int cnt=1;
for(int i=n-1;i;--i) {
sum[i]+=sum[i+1];
if(sum[i]+b[i]>=mx[team[i]^1]) ++cnt;
mx[team[i]]=max(mx[team[i]],sum[i]+b[i]);
}
cout<<cnt<<endl;
}
}
京公网安备 11010502036488号