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),告诉奶牛要去的下一个隔间;这样,为了收集它们的糖果,奶牛就会在牛棚里来回穿梭了。
FJ命令奶牛i应该从i号隔间开始收集糖果。如果一只奶牛回到某一个她已经去过的隔间,她就会停止收集糖果。
在被迫停止收集糖果之前,计算一下每头奶牛要前往的隔间数(包含起点)。
输入格式
第1行 整数n。
第2行到n+1行 每行包含一个整数 next_i 。
输出格式
n行,第i行包含一个整数,表示第i只奶牛要前往的隔间数。
样例解释
有4个隔间
隔间1要求牛到隔间1
隔间2要求牛到隔间3
隔间3要求牛到隔间2
隔间4要求牛到隔间3
牛1,从1号隔间出发,总共访问1个隔间;
牛2,从2号隔间出发,然后到三号隔间,然后到2号隔间,终止,总共访问2个隔间;
牛3,从3号隔间出发,然后到2号隔间,然后到3号隔间,终止,总共访问2个隔间;
牛4,从4号隔间出发,然后到3号隔间,然后到2号隔间,然后到3号隔间,终止,总共访问3个隔间。
翻译提供者:吃葡萄吐糖
题目描述
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.
输入输出样例
说明
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
#include<bits/stdc++.h> #define N 100007 using namespace std;
int n,m,ans,cnt,num,tot;
int head[N],Head[N],dfn[N],low[N],scc[N],bel[N];
int V[N],A[N];
bool in_st[N],vis[N];
stack<int>st;
struct edge{
int u,v,nxt;
}e[N<<],E[N<<]; inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
} inline void add_(int u,int v)
{
E[++cnt].v=v;E[cnt].nxt=Head[u];Head[u]=cnt;
} void Tarjan(int u)
{
dfn[u]=low[u]=++cnt;
st.push(u);in_st[u]=;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(!dfn[v])
Tarjan(v),low[u]=min(low[u],low[v]);
else if(in_st[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
num++;tot=;
while(st.top()!=u)
{
tot++;
bel[st.top()]=num;
in_st[st.top()]=;st.pop();
}
tot++;
bel[st.top()]=num;scc[num]=tot;
in_st[st.top()]=;st.pop();
}
} void dfs(int u,int sum)
{
ans=sum;
for(int i=Head[u];i;i=E[i].nxt)
{
int v=E[i].v;
if(vis[v]) continue;
vis[v]=;dfs(v,sum+scc[v]);
}
} int main()
{
int x;
n=read();
for(int i=;i<=n;i++)
{
x=read();add(i,x);
}
cnt=;
for(int i=;i<=n;i++) if(!dfn[i]) Tarjan(i);
cnt=;
for(int i=;i<=n;i++) for(int j=head[i];j;j=e[j].nxt)
if(bel[i]!=bel[e[j].v]) add_(bel[i],bel[e[j].v]); for(int i=;i<=n;i++)
{
ans=;memset(vis,,sizeof vis);
if(!V[bel[i]])
{
V[bel[i]]=,vis[bel[i]]=,dfs(bel[i],scc[bel[i]]),A[bel[i]]=ans;
}
else ans=A[bel[i]];
printf("%d\n",ans);
}
return ;
}
40暴搜
/*
Tarjan处理出环之后记忆化搜索即可。
*/
#include<bits/stdc++.h> #define N 100007 using namespace std;
int n,m,ans,cnt,num,tot;
int head[N],Head[N],dfn[N],low[N],scc[N],bel[N];
int V[N],A[N];
bool in_st[N],vis[N];
stack<int>st;
struct edge{
int u,v,nxt;
}e[N<<],E[N<<]; inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} inline void add(int u,int v)
{
e[++cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;
} inline void add_(int u,int v)
{
E[++cnt].v=v;E[cnt].nxt=Head[u];Head[u]=cnt;
} void Tarjan(int u)
{
dfn[u]=low[u]=++cnt;
st.push(u);in_st[u]=;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(!dfn[v])
Tarjan(v),low[u]=min(low[u],low[v]);
else if(in_st[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
num++;tot=;
while(st.top()!=u)
{
tot++;
bel[st.top()]=num;
in_st[st.top()]=;st.pop();
}
tot++;
bel[st.top()]=num;scc[num]=tot;
in_st[st.top()]=;st.pop();
}
} void dfs(int u,int sum)
{
ans=sum;
for(int i=Head[u];i;i=E[i].nxt)
{
int v=E[i].v;
if(vis[v]) continue;
vis[v]=;dfs(v,sum+scc[v]);
}
} int main()
{
int x;
n=read();
for(int i=;i<=n;i++)
{
x=read();add(i,x);
}
cnt=;
for(int i=;i<=n;i++) if(!dfn[i]) Tarjan(i);
cnt=;
for(int i=;i<=n;i++) for(int j=head[i];j;j=e[j].nxt)
if(bel[i]!=bel[e[j].v]) add_(bel[i],bel[e[j].v]); for(int i=;i<=n;i++)
{
ans=;memset(vis,,sizeof vis);
if(!V[bel[i]])
{
V[bel[i]]=,vis[bel[i]]=,dfs(bel[i],scc[bel[i]]),A[bel[i]]=ans;
}
else ans=A[bel[i]];
printf("%d\n",ans);
}
return ;
}
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)的更多相关文章
- LGOJ P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
今天我来给大家带来一片蒟蒻题解 ~~真香 LGOJ P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题目描述 每年,在威斯康星州,奶牛们都会穿上 ...
- 洛谷——P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...
- C++ 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题解
P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 分析: 这棵树上有且仅有一个环 两种情况: 1.讨论一个点在环上,如果在则答案与它指向点相同, 2 ...
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 记忆化搜索dfs
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N<=100,000)个牛棚隔间中留下的糖果,以此来庆祝美国秋天的万圣节. 由于牛棚不太大,FJ通过指定奶牛必须遵 ...
- P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
对于一个牛,它存在两种状态:1.处于联通分量 2.不处于联通分量.对于处于联通分量的牛,求出联通分量的大小:对于不处于联通分量的牛,求出其距离联通分量的路程+联通分量大小. 不同的联通分量,染上不同的 ...
- [P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm (记忆化搜索/DP?,Tarjan?)
第一看还以为是水题 随便打了一个bfs只有40分…… 然后开始颓废 #include<bits/stdc++.h> #define N 100005 using namespace std ...
- [洛谷P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm
题目大意:给你一张有向图,每个点最多一条出边,问从每个开始,走多少步会到一个已经过的点 题解:$tarjan$缩点,然后建反图$DP$ 卡点:无 C++ Code: #include <cstd ...
- LUOGU P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
传送门 解题思路 记忆化搜索,如果搜到环,就将环的大小处理出来. 代码 #include<iostream> #include<cstdio> #include<cstr ...
随机推荐
- Session与Token的区别
1. 为什么要有session的出现?答:是由于网络中http协议造成的,因为http本身是无状态协议,这样,无法确定你的本次请求和上次请求是不是你发送的.如果要进行类似论坛登陆相关的操作,就实现不了 ...
- mysql replication driver 在jdk1.6下失效问题解决
mysql diver包里有relication driver,可以在jdbc层进行读写分离,主写从读默认的配置方式是指定driver为ReplicationDriver,并改写jdbc url一起j ...
- POJ 3264 RMQ问题 用dp解决
#include <cstdio> #include <cstring> #include <iostream> using namespace std; ; #d ...
- CentOS 6.4 下用ntfs-3g挂载Windows NTFS分区
默认情况下,CentOS 6.4不支持Widows NTFS硬盘分区读写,要想把NTFS格式的磁盘挂载到CentOS 6.4下面 需要安装第三方的插件ntfs-3g,这里我们采用编译安装插件. 1.安 ...
- android开发里跳过的坑-AS导入NDK工程提示错误 No such property: sdkHandler for class: com.android.build.gradle.LibraryPlugin
接到一个NDK工程需要调试,导入后发现总是提示错误 Error:(37, 1) A problem occurred evaluating project ':libuvccamera'.> N ...
- Avito Code Challenge 2018 C
C. Useful Decomposition time limit per test 1 second memory limit per test 256 megabytes input stand ...
- 静态区间第k大(分桶法和平方分割)
POJ 2104为例 思想: <挑战程序设计竞赛>中介绍的方法. 分桶法:把一排物品或者平面分成桶,每个桶分别维护自己内部的信息,已达到高效计算的目的. 设一共有n个数,每b个分到一个桶里 ...
- Android自己主动提示文本框(AutoCompleteTextView)
自己主动提示文本框(AutoCompleteTextView)能够加强用户体验,缩短用户的输入时间(百度的搜索框就是这个效果). 首先.在xml中定义AutoCompleteTextView控件: a ...
- cocos2dx塔防游戏逻辑
cocos2dx 塔防游戏逻辑 1.欢迎界面 2.tield制作游戏地图,空块设置cantouch属性为1 3.设置地图锚点,把锚点增加一个锚点容器,给怪物的行走函数传入 该锚点容器參数,让怪物依照锚 ...
- TMS320F28335项目开发记录6_28335之cmd文件具体解释
1.CMD文件的作用 CMD文件的作用就像仓库的货物摆放记录一样,为程序代码和数据分配指定的空间. 2.C语言生成的段 C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真正的指令和数据 ...