Lo Valley P2921 [USACO08DEC] Halloween at the Farm

Description

Every year in Wisconsin the cows celebrate the USA autumn holiday of Halloween by dressing up in costumes and collecting candy that Farmer John leaves in the N (1 <= N <= 100,000) stalls conveniently numbered 1..N.

Because the barn is not so large, FJ makes sure the cows extend their fun by specifying a traversal route the cows must follow. To implement this scheme for traveling back and forth through the barn, FJ has posted a 'next stall number' next_i (1 <= next_i <= N) on stall i that tells the cows which stall to visit next; the cows thus might travel the length of the barn many times in order to collect their candy.

FJ mandates that cow i should start collecting candy at stall i. A cow stops her candy collection if she arrives back at any stall she has already visited.

Calculate the number of unique stalls each cow visits before being forced to stop her candy collection.

POINTS: 100

Every Halloween, the dairy cows in Wisconsin have to dress up and go out to the N cowsheds on the farm to collect candy. Every time they go to a cowshed that has never been before, they will collect 1 candy in the shed.

The farm is not big, so John will try his best to make the cows happy. He sets up a "successor cowshed" for each cowshed. The successor of cowshed i is next_i He tells the cows that they have reached a cowshed After that, just go to the subsequent cowshed and you can collect a lot of candies. In fact, this is a bit of a deceptive way to save his candy.

The i-th cow starts her journey from cowshed i. Please calculate how many candies each cow can collect.

Input

Line 1: A single integer: N

Lines 2..N+1: Line i+1 contains a single integer: next_i

Output

Lines 1..N: Line i contains a single integer that is the total number of unique stalls visited by cow i before she returns to a stall she has previously visited.

Sample Input#1

4 
1 
3 
2 
3 

Sample Output#1:

1 
2 
2 
3 

Four stalls.

  • Stall 1 directs the cow back to stall 1.

  • Stall 2 directs the cow to stall 3

  • Stall 3 directs the cow to stall 2

  • Stall 4 directs the cow to stall 3

Cow 1: Start at 1, next is 1. Total stalls visited: 1.

Cow 2: Start at 2, next is 3, next is 2. Total stalls visited: 2. Cow 3: Start at 3, next is 2, next is 3. Total stalls visited: 2. Cow 4: Start at 4, next is 3, next is 2, next is 3. Total stalls visited: 3


Solution

#include <cstdio>
#include <cstring>
#define MAXN 100005

int _next[MAXN];
int vis[MAXN];
int f[MAXN];
int N;
int C[MAXN];

struct stack{
    int u;
    bool mark;
}st[MAXN];

inline void dfs(int u){
    
    vis[u] = 0;
    bool cur = false;
    int top = 1;
    st[top].u = u;

    while(top>0){
        if((!cur)&&vis[st[top].u]>0){
            f[st[top].u] = top - vis[st[top].u];
            vis[st[top].u] = 0;
            top--;
            st[top].mark = false;
            cur = true;
            C[st[top].u] = 1;
            continue;
        }
        if(cur){
            vis[st[top].u] = 0;
            if(f[st[top].u]>0){
                st[--top].mark = true;
                continue;
            }
            else if(st[top].mark==false){
                f[st[top].u] = f[_next[st[top].u]];
                st[--top].mark = false;
                C[st[top].u] = 1;
                continue;
            }
            else {
                f[st[top].u] = f[_next[st[top].u]]+1;
                st[--top].mark = true;
                C[st[top].u] = 2;
                continue;
            }
        }
        vis[st[top].u] = vis[st[top-1].u]+1;
        st[++top].u = _next[st[top-1].u];
        if(C[st[top].u]>0){
            cur = true;
            st[--top].mark = true;
            f[st[top].u] = f[_next[st[top].u]]+1;
        }
    }
}

int main(){

    scanf("%d",&N);
    for(register int i=1;i<=N;++i){
        scanf("%d",&_next[i]);
    }

    std::memset(vis,0,sizeof(vis));
    std::memset(f,0,sizeof(f));
    std::memset(C,0,sizeof(C));

    for(register int i=1;i<=N;++i){
        if(f[i]==0)dfs(i);
        printf("%d\n",f[i]);
    }
    return 0;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325163429&siteId=291194637