题目链接
题意
从前,有n只萌萌的糖糖,他们分成了两组一起玩游戏。他们会排成一排,第i只糖糖会随机得到一个能力值bi。从第i秒的时候,第i只糖糖就可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的糖糖。
为了使游戏更加有趣,糖糖的爸爸,娇姐,会发功m次,第i次发功的时间为ci,则在第ci秒结束后,b1,b2,…,bci都会增加1.
现在,娇姐想知道在第n秒后,会有多少只糖糖存活下来。
思路
- 实现使用前缀和对能力值进行处理
- 因为有两组,所以设置两个最大值,然后从后往前遍历
- 注意题目中序列从1开始
参考代码
#include<bits/stdc++.h>
using namespace std;
int aa[50010],bb[50010],cc[50010];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
memset(cc,0,sizeof(cc));
int m,n;
cin>>n>>m;
int ans=n;
for(int i=1; i<=n; i++)
{
cin>>aa[i]>>bb[i];
}
int tmp;
for(int i=1; i<=m; i++)
{
cin>>tmp;
cc[tmp]++;
}
for(int i=n; i>0; i--)
{
cc[i]+=cc[i+1];
bb[i]+=cc[i];
}
int max0=0,max1=0;
for(int i=n; i>0; i--)
{
if(aa[i])
{
max1=max(max1,bb[i]);
if(bb[i]<max0)
{
ans--;
}
}
else
{
max0=max(max0,bb[i]);
if(bb[i]<max1)
{
ans--;
}
}
}
cout<<ans<<endl;
}
}