[USACO08DEC]在农场万圣节Trick or Treat on the Farm

题目描述

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

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

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

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

输入输出格式

输入格式:

 

* Line 1: A single integer: N

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

 

输出格式:

 

* 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.

 

输入输出样例

输入样例#1: 

4
1
3
2
3

输出样例#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.

解:

期望:?  实际:40

暴力枚举下一个,环,未知......

也可以用tarjan缩点,然后剩下的一定是个DAG,dp找也行。

拓扑排序删链 → 对环上的点计算答案 → dfs计算其他点的答案。

环上的点答案都一样,可以一遍dfs跑出来;

其他点的答案在dfs返回的时候+1即可。

还要记忆化搜索,不然会T

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<map>
 6 #include<cstring>
 7 #include<string>
 8 using namespace std;
 9 inline int read()
10 {
11     int x=0,w=1;char ch=getchar();
12     while(!isdigit(ch)){if(ch==‘-‘) w=-1;ch=getchar();}
13     while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar();
14     return x*w;
15 }
16 const int N=1e5+90;
17 int n,v[N],ne[N],ans[N];
18 int in[N];
19 bool vis[N];
20 void del(int x)
21 {
22     vis[x]=1;
23     in[ne[x]]--;
24     if(!in[ne[x]]) del(ne[x]);
25 }
26 int ccalc(int x,int dep)
27 {
28     ans[x]=dep;
29     if(ans[ne[x]]) return dep;
30     else return ans[x]=ccalc(ne[x],dep+1);
31 }
32 int calc(int x)
33 {
34     if(ans[x]) return ans[x];
35     else return ans[x]=calc(ne[x])+1;
36 }
37 int main()
38 {
39     n=read();
40     for(int i=1,x;i<=n;++i)
41     {
42         x=read();ne[i]=x;
43         in[x]++;
44     }
45     for(int i=1;i<=n;++i)
46      if(!in[i] && !vis[i]) del(i);
47     for(int i=1;i<=n;++i)
48      if(in[i] && !ans[i]) ccalc(i,1);
49     for(int i=1;i<=n;++i)
50      if(!in[i] && !ans[i]) calc(i);
51     for(int i=1;i<=n;++i) printf("%d\n",ans[i]);
52     return 0;
53 }

安然流香

╮(╯3╰)╭睡眠不足

原文地址:https://www.cnblogs.com/adelalove/p/8524694.html

时间: 2024-08-29 10:22:41

[USACO08DEC]在农场万圣节Trick or Treat on the Farm的相关文章

洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 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 conven

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵循的穿越路线来确保奶牛的乐趣.为了实现这个让奶牛在牛棚里来回穿梭的方案,FJ在第i号隔间上张贴了一个“下一个隔间”Next_i(1<=Next_i<=N),告诉奶牛要去的下一个隔间:这样

P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 记忆化搜索dfs

题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵循的穿越路线来确保奶牛的乐趣.为了实现这个让奶牛在牛棚里来回穿梭的方案,FJ在第i号隔间上张贴了一个“下一个隔间”Next_i(1<=Next_i<=N),告诉奶牛要去的下一个隔间:这样,为了收集它们的糖果,奶牛就会在牛棚里来回穿梭了. FJ命令奶牛i应该从i号隔间开始收集糖果.如果一只奶牛回到某

[BZOJ1589][Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 719  Solved: 408 [Submit][Status][Discuss] Description 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N(1≤N≤100000)个牛棚里转悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽

[Usaco2008 Dec][BZOJ1589] Trick or Treat on the Farm 采集糖果

1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 438  Solved: 244[Submit][Status][Discuss] Description 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N(1≤N≤100000)个牛棚里转悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子

[USACO08DEC] Trick or Treat on the Farm

题目描述 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐.他给每一个牛棚设置了一个"后继牛 棚".牛棚i的后继牛棚是next_i 他告诉奶牛们,她们到了一个牛棚之后,只要再往后继牛棚走去, 就可以搜集到很多糖果.事实上这是一种有点欺骗意味的手段,来节约他的糖果. 第i只奶牛从牛棚i开始她的旅程.请你计算,每一只奶牛可以采集到多少糖果. 输入输出格

P2921 [USACO08DEC]Trick or Treat on the Farm G(Targan)

https://www.luogu.com.cn/problem/P2921 #include<bits/stdc++.h> using namespace std; const int Maxn=100005; int nxt[Maxn]; int ans[Maxn]; int head[Maxn],cnt; struct road{ int to,next; }e[Maxn*2]; void add(int a,int b){ cnt++; e[cnt].to=b; e[cnt].next

bzoj 1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

Description 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N(1≤N≤100000)个牛棚里转悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐.他给每一个牛棚设置了一个"后继牛棚".牛棚i的后继牛棚是Xi.他告诉奶牛们,她们到了一个牛棚之后,只要再往后继牛棚走去,就可以搜集到很多糖果.事实上这是一种有点欺骗意味的手段,来节约他的糖果.  第i只奶牛从牛棚i开始她的旅程.请你计算,每一只奶牛可以采

p2921 Trick or Treat on the Farm

传送门 题目 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果.农场不大,所以约翰要想尽法子让奶牛们得到快乐.他给每一个牛棚设置了一个"后继牛 棚".牛棚i的后继牛棚是next_i 他告诉奶牛们,她们到了一个牛棚之后,只要再往后继牛棚走去, 就可以搜集到很多糖果.事实上这是一种有点欺骗意味的手段,来节约他的糖果.第i只奶牛从牛棚i开始她的旅程.请你计算,每一只奶牛可以采集到多少糖果. 分析 首先