当前位置: 代码迷 >> 综合 >> P2921 [USACO08DEC]在农场万圣节
  详细解决方案

P2921 [USACO08DEC]在农场万圣节

热度:86   发布时间:2023-12-21 04:43:20.0

题目描述

原题题面

每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果.

农场不大,所以约翰要想尽法子让奶牛们得到快乐.他给每一个牛棚设置了一个“后继牛 棚”.牛棚i的后继牛棚是next_i 他告诉奶牛们,她们到了一个牛棚之后,只要再往后继牛棚走去, 就可以搜集到很多糖果.事实上这是一种有点欺骗意味的手段,来节约他的糖果.

第i只奶牛从牛棚i开始她的旅程.请你计算,每一只奶牛可以采集到多少糖果.

第i只奶牛从牛棚i开始她的旅程.请你计算,每一只奶牛可以采集到多少糖果.

【AC代码】:

#include <bits/stdc++.h>
#define M(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f
#define MOD 10000007
using namespace std;inline void read(int &x){
    char ch=getchar(),c=ch;x=0;while(ch<'0' || ch>'9'){
    c=ch;ch=getchar();}while(ch>='0' && ch<='9'){
    x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}if(c=='-')x=-x;
}const int maxn=100005;int n,i,k,cnt=0;
int next[maxn],col[maxn],dfn[maxn],dfn2[maxn],cow[maxn];int main(){
    read(n);for(i=1;i<=n;i++)read(next[i]);for(k=1;k<=n;k++){
    cnt=0;for(i=k;;i=next[i],cnt++){
    if(!col[i]){
    col[i]=k;dfn[i]=cnt;}elseif(col[i]==k){
    cow[k]=cnt-dfn[i];dfn2[k]=dfn[i];printf("%d\n",cnt);break;}else{
    cow[k]=cow[col[i]];dfn2[k]=cnt+max(dfn2[col[i]]-dfn[i],0);printf("%d\n",dfn2[k]+cow[k]);break;}}}
}