[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;
}