CF45B School 题解
前言
复杂度是玄学的,过是能过的。
(其实也不是玄学,似乎复杂度是能分析出来的)
题意
就是一大堆小朋友玩分糖,当前这个人如果有
好了这就是核心问题。
思路
搜索都学过吧。
由于每个人都只有一个朋友,所以可以直接循环去找。运用类似记忆化搜索的思路,保存每一个位置最大得热度,如果当前的热度过小,就停止搜索,不然就继续搜索下去。如果当前这个人是第一次知道消息,那就把这个能传的人数增加。
记得初始化!!!
(不支持hack数据,原OJ能通过)
Code
#include<bits/stdc++.h>
using namespace std;
int n,m,i,a,sum,t,g[100010],v[100010],b[100010],f[100010];
int main(){
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&g[i]);
for (i=1;i<=m;i++) scanf("%d",&v[i]);
for (i=1;i<=m;i++) scanf("%d",&b[i]);
for (i=1;i<=m;i++){
a=(v[i]+sum-1)%n+1;t=b[i];sum=0;
while (f[a]<t&&t!=0){
if (!f[a]) sum++;
f[a]=t;a=g[a];t--;
}
printf("%d\n",sum);
}
return 0;
}