题目链接
题解:因为这个题我们只需要数出所有的比1队要强的队是多少,所以我们可以维护一个vector,数组存的的是当前所有的比队伍1强的队,然后每次来了之后根据信息更新即可。
下面是RTE3的代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
vector<int> vec;
const int N=1e6+10;
int pro[N],plenty[N];
bool st[N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int id,p;
scanf("%d%d",&id,&p);
pro[id]++;
plenty[id]+=p;
if(pro[id]>pro[1]||pro[id]==pro[1]&&plenty[id]<plenty[1])
{
if(!st[id])//没有在数组内
{
vec.push_back(id);
st[id]=true;
}
//在数组内的话不用管
}
else if(id==1)//假设增加的是他本身,需要访问数组
{
int len=vec.size();
for(int j=0;j<len;j++)
{
int x=vec[j];
if(pro[x]<pro[1]||pro[x]==pro[1]&&plenty[x]>=plenty[1])
{
vec.erase(vec.begin()+j,vec.begin()+j+1);
st[x]=false;//已经不在数组内
}
}
}
printf("%d\n",vec.size()+1);//数组内留的都是大于1的数
}
return 0;
}
开始看了半天不知道哪错了,但是后来发现那个vector删除就是erase那错了,因为每次删除后len–,随之j–,所以下面是AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
vector<int> vec;
const int N=1e6+10;
int pro[N],plenty[N];
bool st[N];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int id,p;
scanf("%d%d",&id,&p);
pro[id]++;
plenty[id]+=p;
if(pro[id]>pro[1]||pro[id]==pro[1]&&plenty[id]<plenty[1])
{
if(!st[id])//没有在数组内
{
vec.push_back(id);
st[id]=true;
}
//在数组内的话不用管
}
else if(id==1)//假设增加的是他本身,需要访问数组
{
int len=vec.size();
for(int j=0;j<len;j++)
{
int x=vec[j];
if(pro[x]<pro[1]||pro[x]==pro[1]&&plenty[x]>=plenty[1])
{
vec.erase(vec.begin()+j,vec.begin()+j+1);
j--;
len--;
st[x]=false;//已经不在数组内
}
}
}
printf("%d\n",vec.size()+1);//数组内留的都是大于1的数
}
return 0;
}