CF45B-【School】题解

· · 题解

前言

复杂度是玄学的,过是能过的。

思路

直接模拟就好了,注意到一个人只有一个朋友,直接热度减一就好了。

如果有人多次得到消息,那肯定是热度最大的一次最有效果(因为传播人数最多)。

同时只有第一次知道消息才计入答案。

代码

#include<bits/stdc++.h>
using namespace std;
int g[100001],v[100001],b[100001],nowthis[100001];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int x=1;x<=n;x++)
    cin>>g[x];
    for(int x=1;x<=m;x++)
    cin>>v[x];
    for(int x=1;x<=m;x++)
    cin>>b[x];
    int lastans=0;
    for(int x=1;x<=m;x++)
    {
        int ans=0;
        for(int y=(v[x]+lastans-1)%n+1;nowthis[y]<b[x];y=g[y])
        {
            if(nowthis[y]==0)ans++;
            nowthis[y]=b[x];
            b[x]--;
        }
        lastans=ans;
        cout<<ans<<endl;
    }
}