Loading

[EGOI2024] Infinite Race题解

[EGOI2024] Infinite Race

妙妙题。

我们设 \(cnt[x]\) 表示当Anika和第 \(x\) 位选手相遇时Anika至少几次经过终点线。

设定初始状态 \(cnt[x]=-1\) 表示两种等价的情况:

  • Anika还未和第 \(x\) 位选手相遇过
  • Anika被第 \(x\) 位选手超越了

因此只剩下Anika超越了第 \(x\) 位选手的情况。

image

我们维护 \(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;
}
posted @ 2024-09-13 13:55  AvisD  阅读(55)  评论(0)    收藏  举报