[EGOI2024] Infinite Race
妙妙题。
我们设 \(cnt[x]\) 表示当Anika和第 \(x\) 位选手相遇时Anika至少几次经过终点线。
设定初始状态 \(cnt[x]=-1\) 表示两种等价的情况:
- Anika还未和第 \(x\) 位选手相遇过
- Anika被第 \(x\) 位选手超越了
因此只剩下Anika超越了第 \(x\) 位选手的情况。
我们维护 \(ans\) 表示当前Anika至少几次经过终点线。
如上图所示,发现Anika超越了第 \(x\) 位选手后她从上次相遇开始至少又跑了一圈,所以 \(cnt[x]=max(cnt[x]+1,ans)\)。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,q,ans,cnt[N];
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<n;i++)cnt[i]=-1;//Anika还没和任何人相遇
while(q--)
{
int x;
scanf("%d",&x);
if(x>0)
{
cnt[x]++;//Anika又跑了一圈
ans=cnt[x]=max(cnt[x],ans);//在当前答案ans和cnt[x]中取最大值
}
else
{
//Anika被超越了
cnt[-x]=-1;//再设置成初始状态
}
}
printf("%d",ans);
return 0;
}
标签:cnt,Anika,int,题解,EGOI2024,选手,ans,Infinite
From: https://www.cnblogs.com/DLYdly1105/p/18412051