Reordering the Cows

牛客网传送

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format:%lld
链接:https://ac.nowcoder.com/acm/contest/4860/B
来源:牛客网

题目描述

Farmer John’s N cows (1 <= N <= 100), conveniently numbered 1…N, are
standing in a row. Their ordering is described by an array A, where
A(i) is the number of the cow in position i. Farmer John wants to
rearrange them into a different ordering for a group photo, described
by an array B, where B(i) is the number of the cow that should end up
in position i.

For example, suppose the cows start out ordered as follows:

A = 5 1 4 2 3

and suppose Farmer John would like them instead to be ordered like
this:

B = 2 5 3 1 4

To re-arrange themselves from the “A” ordering to the “B” ordering,
the cows perform a number of “cyclic” shifts. Each of these cyclic
shifts begins with a cow moving to her proper location in the “B”
ordering, displacing another cow, who then moves to her proper
location, displacing another cow, and so on, until eventually a cow
ends up in the position initially occupied by the first cow on the
cycle. For example, in the ordering above, if we start a cycle with
cow 5, then cow 5 would move to position 2, displacing cow 1, who
moves to position 4, displacing cow 2, who moves to position 1, ending
the cycle. The cows keep performing cyclic shifts until every cow
eventually ends up in her proper location in the “B” ordering. Observe
that each cow participates in exactly one cyclic shift, unless she
occupies the same position in the “A” and “B” orderings.

Please compute the number of different cyclic shifts, as well as the
length of the longest cyclic shift, as the cows rearrange themselves.

输入描述:

  • Line 1: The integer N.

  • Lines 2…1+N: Line i+1 contains the integer A(i).

  • Lines 2+N…1+2N: Line 1+N+i contains the integer B(i)

输出描述:

  • Line 1: Two space-separated integers, the first giving the number of cyclic shifts and the second giving the number cows involved in the
    longest such shift. If there are no cyclic shifts, output -1 for the
    second number.

示例1
输入

5
5
1
4
2
3
2
5
3
1
4

输出

2 3

题意:
比如样例:通过移动A,将A=B
A 5 1 4 2 3
B 2 5 3 1 4
id 1 2 3 4 5
首先A中5要到1的位置(id=2),然后1移动到2的位置上(id=4),2要移动到5的位置上上(id=1)就是一个环,5->1->2->5,移动次数为3(也就是环的长度),除此之外还有4->3->4,移动次数为2,问将A通过移动转化成B的过程中,最长移动次数(即最长的环)是多少?环的数量是多少?
题解:
(第一二个代码讲述的是我做错的过程,正解在是第三个)
这题是我难以忘记的痛o(╥﹏╥)o
在这里插入图片描述看完这个题第一反应是noip考过的信息传递,所以一开始就用并查集来做,father[A[id]]=B[id](就是id相对于A的父亲节点是B),因为一定能成环,所以就找一共多少个环,并求出最长环的长度
然而。。。。在这里插入图片描述
我调了一阵子也但还是段错误,我换了个oj测评一下,然后就就AC了。。。玄学(可能这个oj数据弱

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int a[10000];
int b[194000];
int father[10003];
bool f[100004];
int maxx=0;
void unionn(int x,int y)
{father[x]=y;
}
int find(int x,int z)
{if(father[x]==x)return 0;//如果这个数在A中与B中位置相同,不需要交换else if(f[x]==1&&z==0)return 0;//如果这个数曾经被查询过else if(f[x]==1&&z!=0)return 1;//如果这个环第一次被查询z++;//z只有0和非0,来表示这个数之前是否被查询过f[x]=1;maxx=max(maxx,z);find(father[x],z);//不断地向后查找5->1->2
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int j=1;j<=n;j++){cin>>b[j];unionn(a[j],b[j]);}int tot=0;for(int i=1;i<=n;i++){if(a[i]!=b[i])tot++;}if(tot==0){cout<<0<<" "<<-1;return 0;}int ant=0;for(int i=1;i<=n;i++){if(find(i,0))ant++;}cout<<ant<<" "<<maxx;
}

我痛定思痛,感觉是因为自身递归导致段错误,又改了一个思路,在寻找根节点并压缩路径的时候,顺便用dis来记录路径的长度,然后统计出最长的路径。
结果没段错误,但。。。wa了。。唉

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int a[10030];
int b[19333];
int father[100333];
bool f[10034];//标记这个点所在的环是否被查询过
int dis[100022];
int maxx=0;
//void unionn(int x,int y)
//{
//  father[x]=y;
//}
void init()
{for(int i=1;i<=n;i++){father[i]=i;}
}
int find(int x)
{if(father[x]!=x){int last=father[x];father[x]=find(father[x]);dis[x]+=dis[last];}return father[x];
}
void unionn(int aa,int bb)
{if(aa==bb)return;int x=find(aa);int y=find(bb);if(x!=y){father[x]=y;dis[aa]=dis[bb]+1;}else maxx=max(maxx,dis[aa]+dis[bb]+1);//更新最长边
}
//int find(int x,int z)
//{
//  if(father[x]==x)return 0;
//  else if(f[x]==1&&z==0)return 0;
//  else if(f[x]==1&&z!=0)return 1;
//  z++;
//  f[x]=1;
//  maxx=max(maxx,z);
//  find(father[x],z);
//}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int j=1;j<=n;j++){cin>>b[j];}init();int tot=0;for(int i=1;i<=n;i++){if(a[i]!=b[i])tot++;else f[a[i]]=1;}if(tot==0){cout<<0<<" "<<-1;return 0;}int ant=0;//多少个环for(int i=1;i<=n;i++){unionn(a[i],b[i]);}for(int i=1;i<=n;i++){if(f[father[i]]==0){ant++;f[father[i]]=1;}}cout<<ant<<" "<<maxx;
}

我冷静一会后,重新思考,感觉把题越想越复杂了
样例:
A 5 1 4 2 3
B 2 5 3 1 4
f[]来标记id是否被查询过
我们用fa和fb来记录A和B中数的id位置,然后在union时,通过father[]来让 A中的点对应B的位置相互指向,A中id=1的5指向id=2的1,father[5]=1,依次类推
A ------->5 1 4 2 3
fa------->2 4 5 3 1
B-------->2 5 3 1 4
fb-------->4 1 3 5 2
father—>2 4 5 1 3
在查找时for(i->n),查询该点i后,接着查与这点i相连的点father[i],并用f[]标记,ans记录长度,如果相连的点>2(也就是这个点不是指向自己),统计最长环长,并记录换的数量

#include<bits/stdc++.h>
#define for(n) for(int i=1;i<=n;i++)
using namespace std;
typedef long long ll;
int n;
int a[10030];
int b[19333];
int father[100333];
int fa[10034];
int fb[10034];
int f[100022];
int maxx=0;
int ans;
int id;
int tot=0;
int w=0;
int find()
{for(n){if(f[i]==0){id=i;ans=0;while(f[id]==0){f[id]=1;ans++;id=father[id];}if(ans>1){tot=max(ans,tot);w++;}}}return tot;
}
void init()
{for(n){fa[a[i]]=i;	fb[b[i]]=i;}
}
void init1()
{for(n){father[fa[a[i]]]=fb[a[i]];}	}
//void unionn(int x,int y)
//{
//	father[x]=y;
//}
//void unionn(int aa,int bb)
//{
//	if(aa==bb)return;
//	int x=find(aa);
//	int y=find(bb);
//	if(x!=y)
//	{
//		father[x]=y;
//		dis[aa]=dis[bb]+1;
//	}
//	else maxx=max(maxx,dis[aa]+dis[bb]+1);
//}
//	for(int i=1;i<=n;i++)
//	{
//		if(a[i]!=b[i])tot++;
//		else f[a[i]]=1;
//	}
//	if(tot==0)
//	{
//		cout<<0<<" "<<-1;
//		return 0;
//	}
//	int ant=0;
//	for(int i=1;i<=n;i++)
//	{
//		
//		unionn(a[i],b[i]);
//	}
//	for(int i=1;i<=n;i++)
//	{
//		if(f[father[i]]==0)
//		{
//			ant++;
//			f[father[i]]=1;
//		}
//	}
//	cout<<ant<<" "<<maxx;
int main()
{cin>>n;for(n)cin>>a[i];for(n)cin>>b[i];init();init1();if(find()==0)cout<<0<<" "<<-1;else cout<<w<<" "<<tot;}

终于做出来了。。。我太菜了o(╥﹏╥)o

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回顾4180天在腾讯使用C#的历程,开启新的征途

今天是2018年8月8日&#xff0c;已经和腾讯解除劳动关系&#xff0c;我的公司正式开始运营&#xff0c;虽然还有很多事情需要理清&#xff0c;公司官网也没有做&#xff0c;接下来什么事情都需要自己去完成了&#xff0c;需要一步一个脚印去完善&#xff0c;开启一个新的征途。…

稳定工作和创业之间的抉择

早上写的文章《回顾4180天在腾讯使用C#的历程&#xff0c;开启新的征途》是我在腾讯写的最后一篇对过往10年在腾讯使用C#语言的总结&#xff0c;今天收到反馈有人在造谣腾讯开始去.net&#xff0c;我被迫辞职了。这非常的不负责任&#xff0c;我必须写这篇文章来辟谣。要说腾讯…

牛客2020年愚人节比赛

欢乐的一晚上 题目链接 其实做做也挺好&#xff0c;脑筋急转弯&#xff0c;不需要算法不需要数据结构&#xff0c;纯娱乐 还有不知道是哪位哥的&#xff0c;心疼一下 题解 注&#xff1a;一下题解没必要较劲&#xff0c;欢乐局而已 对不对无所谓&#xff0c;换了最重要奥 A题ra…

IdentityServer4 知多少

1. 引言现在的应用开发层出不穷&#xff0c;基于浏览器的网页应用&#xff0c;基于微信的公众号、小程序&#xff0c;基于IOS、Android的App&#xff0c;基于Windows系统的桌面应用和UWP应用等等&#xff0c;这么多种类的应用&#xff0c;就给应用的开发带来的挑战&#xff0c;…

牛客网【每日一题】4月2日 月月查华华的手机

牛客网链接 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 月月和华华一起去吃饭了。期间华华有事出去了一会儿&#xff0c;没有带手机。月月出于人类最单纯的好奇心&#…

【二分】Best Cow Fences(poj 2018)

Best Cow Fences poj 2018 题目大意&#xff1a; 给出一个正整数数列&#xff0c;要你求平均数最大&#xff0c;长度不小于M的字串&#xff0c;结果乘1000取整 输入样例 10 6 6 4 2 10 3 8 5 9 4 1输出样例 6500数据范围 1⩽N⩽100,0001\leqslant N \leqslant 100,0001⩽…

离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习

离散哈特莱变换(DHT)及快速哈特莱变换(FHT)学习 说在前边 最近复习\(DSP\)的时候&#xff0c;发现了一个号称专门针对离散实序列的变换&#xff0c;经分析总运算量为普通\(FFT\)的几乎一半&#xff0c;而且完全没有复数。这么强的吗&#xff1f;于是花了一个下午&#xff0c;去…

.NET Core 2.1中的分层编译(预览)

如果您是.NET性能的粉丝&#xff0c;最近有很多好消息&#xff0c;例如.NET Core 2.1中的性能改进和宣布.NET Core 2.1&#xff0c;但我们还有更多的好消息。分层编译是一项重要的新特性功能&#xff0c;我们可以作为预览供任何人试用&#xff0c;从.NET Core 2.1开始。在我们测…

选择IT事业,意味着终身学习

八月&#xff0c;炎阳如火。 前几天书记找我交流&#xff0c;问我离职的原因&#xff0c;我跟他仔细的分析了一下我的职业发展规划和我对于未来的预期&#xff0c;书记也向我分析了一下他所认为的原因&#xff0c;他说&#xff0c;无外乎是三个原因&#xff1a;第一个是钱的问…

牛客网【每日一题】Shortest Path 4月3日题目精讲 DFS

题号 NC13886 Shortest Path 西南交通大学第十三届ACM决赛 题意&#xff1a; 一棵偶数节点的树&#xff0c;分成n/2对&#xff0c;两两一组&#xff0c;所有组的路径之和最小是多少&#xff1f; 题解&#xff1a; 如果两个点之间相连将另外两个相连的点覆盖&#xff0c;那么完全…

使用Jexus服务器运行Asp.Net Core2.0程序

前段时间写了篇关于.net core跨平台部署的文章。https://my.oschina.net/lichaoqiang/blog/1861977主要讲述了&#xff0c;利用NginxCentOSSupervisor.NetCore2.1&#xff0c;来运行.net core程序&#xff0c;感兴趣的朋友可以看一下。今天向大家介绍.net core使用jexus服务器的…

【结论】棋盘(jzoj 2297)

棋盘 jzoj 2297 题目大意&#xff1a; 在棋盘上有一个特殊的象&#xff0c;他可以向四个方向行走若干步&#xff08;左上&#xff0c;左下&#xff0c;右上&#xff0c;右下&#xff09;&#xff0c;现在问从某一个点是否能到另外一个点 输入样例 5 1 1 2 2 2 3 2 2 1 2 4…

RRRR_wys' Blog 3.0 准备上线啦!

RRRR_wys Blog 3.0 准备上线啦&#xff01; 今年马上要过完啦&#xff0c;打算在年前把博客翻翻新之前的布局太复杂了&#xff0c;感觉很视觉疲劳&#xff0c;这一版我打算能删就删完善了\(markdown\)还有一些地方要修&#xff0c;放假再说辣在vj上交了道cf&#xff0c;有惊喜 …

WebApiClient的JsonPatch局部更新

1. 文章目的随着WebApiClient的不断完善&#xff0c;越来越多开发者选择WebApiClient替换原生的HttpClient&#xff0c;本文将介绍使用WebApiClient来完成JsonPatch提交的新特性。2. json patch介绍在服务端WebApi开发的时候&#xff0c;如果设计一个更新登录用户的个人信息的接…

【bfs】神殿(jzoj 2296)

神殿 jzoj 2296 题目大意&#xff1a; 用一个n∗mn*mn∗m的矩阵&#xff0c;每个单位都是一个1∗11*11∗1的房间&#xff0c;房间的四个方向只有某些方向有门&#xff08;说明如下图&#xff09;&#xff0c;要从一个房间走向相邻的房间&#xff08;算一个单位时间&#xff…

如何在本地数据中心安装Service Fabric for Windows集群

概述首先本文只是对官方文档&#xff08;中文&#xff0c;英文&#xff09;的一个提炼&#xff0c;详细的安装说明还请仔细阅读官方文档。虽然Service Fabric的官方名称往往被加上Azure&#xff0c;但是实际上&#xff08;估计很多人不知道&#xff09;Service Fabric可以安装到…

Asp.Net Core实战

序言使用.NET Core&#xff0c;团队可以更容易专注的在.net core上工作。比如核心类库&#xff08;如System.Collections&#xff09;的更改仍然需要与.NET Framework相同的活力&#xff0c;但是ASP.NET Core或Entity Framework Core可以更轻松地进行实质性更改&#xff0c;而不…

DFS序讲解

我们经常会遇到树的问题&#xff0c;但树是非线性的结构&#xff0c;操作起来始终还是麻烦&#xff0c;如果我们能把树改造成线性结构&#xff0c;有什么方法&#xff1f;对&#xff0c;就是今天要讲的DSF序&#xff1b; dfs序呢&#xff0c;就是把一棵树区间化&#xff0c;我们…

利用Asp.Net Core的MiddleWare思想处理复杂业务流程

最近利用Asp.Net Core 的MiddleWare思想对公司的古老代码进行重构&#xff0c;在这里把我的设计思路分享出来&#xff0c;希望对大家处理复杂的流程业务能有所帮助。背景一个流程初始化接口&#xff0c;接口中根据传入的流程类型&#xff0c;需要做一些不同的工作。1.有的工作是…

F# 4.5提供Spans、Match!等特性

F# 4.5预览版现已发布&#xff0c;其中提供了一系列新特性&#xff0c;包括对.NET Core 2.1的新原生类型Span<T>的支持、新关键字Match!等。类型Span意在实现底层代码指针操作的安全性和可预测性&#xff0c;这可使得很多情况下不必再分配内存&#xff0c;进而改进了内存…