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

2024-01-07 05:50

本文主要是介绍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.

 

输入输出样例

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

 

#include<bits/stdc++.h>#define N 100007using 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<<1],E[N<<1];inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';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]=1;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=0;while(st.top()!=u){tot++;bel[st.top()]=num;in_st[st.top()]=0;st.pop();}tot++;bel[st.top()]=num;scc[num]=tot;in_st[st.top()]=0;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]=1;dfs(v,sum+scc[v]);}
}int main()
{int x;n=read();for(int i=1;i<=n;i++){x=read();add(i,x);}cnt=0;for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);cnt=0;for(int i=1;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=1;i<=n;i++){    ans=0;memset(vis,0,sizeof vis);if(!V[bel[i]]){V[bel[i]]=1,vis[bel[i]]=1,dfs(bel[i],scc[bel[i]]),A[bel[i]]=ans;}else ans=A[bel[i]];printf("%d\n",ans);}return 0;
} 
40暴搜
/*
Tarjan处理出环之后记忆化搜索即可。 
*/
#include<bits/stdc++.h>#define N 100007using 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<<1],E[N<<1];inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';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]=1;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=0;while(st.top()!=u){tot++;bel[st.top()]=num;in_st[st.top()]=0;st.pop();}tot++;bel[st.top()]=num;scc[num]=tot;in_st[st.top()]=0;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]=1;dfs(v,sum+scc[v]);}
}int main()
{int x;n=read();for(int i=1;i<=n;i++){x=read();add(i,x);}cnt=0;for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i);cnt=0;for(int i=1;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=1;i<=n;i++){    ans=0;memset(vis,0,sizeof vis);if(!V[bel[i]]){V[bel[i]]=1,vis[bel[i]]=1,dfs(bel[i],scc[bel[i]]),A[bel[i]]=ans;}else ans=A[bel[i]];printf("%d\n",ans);}return 0;
} 

 

转载于:https://www.cnblogs.com/L-Memory/p/9878738.html

这篇关于P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm(Tarjan+记忆化)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578905

相关文章

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

JS中【记忆函数】内容详解与应用

在 JavaScript 中,记忆函数(Memoization)是一种优化技术,旨在通过存储函数的调用结果,避免重复计算以提高性能。它非常适用于纯函数(同样的输入总是产生同样的输出),特别是在需要大量重复计算的场景中。为了彻底理解 JavaScript 中的记忆函数,本文将从其原理、实现方式、应用场景及优化方法等多个方面详细讨论。 一、记忆函数的基本原理 记忆化是一种缓存策略,主要用于函数式编

记忆化搜索【下】

375. 猜数字大小II 题目分析 题目链接:375. 猜数字大小 II - 力扣(LeetCode) 题目比较长,大致意思就是给一个数,比如说10,定的数字是7,让我们在[1, 10]这个区间猜。 如果猜大或猜小都会说明是大了还是小了,此外,我们还需要支付猜错数字对应的现金。 现在就是让我们定制一个猜测策略,确保准备最少的钱能猜对 如果采用二分查找,只能确保最小次数,题目要求的

自然语言处理系列六十三》神经网络算法》LSTM长短期记忆神经网络算法

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十三神经网络算法》LSTM长短期记忆神经网络算法Seq2Seq端到端神经网络算法 总结 自然语言处理系列六十三 神经网络算法》LSTM长短期记忆神经网络算法 长短期记忆网络(LSTM,Long S

【UVA】10651-Pebble Solitaire(直接递归或者记忆化)

不知道这个题UVA的数据是怎么的,用2个方法交了,第一次直接递归,第二次记忆化剪枝,时间竟然一样!? 直接郁闷了,简单的二进制表示状态和二进制运算。 14145176 10651 Pebble Solitaire Accepted C++ 0.009 2014-09-04 09:18:21 #include<cstdio>#include<algorithm>#inclu

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出

回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出 目录 回归预测 | MATLAB实现PSO-LSTM(粒子群优化长短期记忆神经网络)多输入单输出预测效果基本介绍模型介绍PSO模型LSTM模型PSO-LSTM模型 程序设计参考资料致谢 预测效果 Matlab实现PSO-LSTM多变量回归预测 1.input和outpu

NYOJ 37 回文字符串(记忆化搜索)

OJ题目 : 戳这里~~ 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000.

XTOJ 1168 Alice and Bob (记忆化搜索)

OJ题目 : click here ~~ 题意分析:给一个数n,Alice可取1,2 , 4 ……2的i次方 ,Bob可取1,3,9……3的i次方。Alice先取,后Bob。轮流来,每个人至少取1。求n变成0,至少需要取多少次。记忆化搜索 = 搜索 + dp 。 AC_CODE #define gril 0#define boy 1using namespace std;const

自动驾驶系列—记忆泊车技术:未来驾驶的智能伴侣

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。 🚀 探索专栏:学步_技术的首页 —— 持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。 🔍 技术导航: 人工智能:深入探讨人工智

Learning Memory-guided Normality for Anomaly Detection——学习记忆引导的常态异常检测

又是一篇在自编码器框架中研究使用记忆模块的论文,可以看做19年的iccv的论文的衍生,在我的博客中对19年iccv这篇论文也做了简单介绍。韩国人写的,应该是吧,这名字听起来就像。 摘要abstract 我们解决异常检测的问题,即检测视频序列中的异常事件。基于卷积神经网络的异常检测方法通常利用代理任务(如重建输入视频帧)来学习描述正常情况的模型,而在训练时看不到异常样本,并在测试时使用重建误