题目链接:

http://codeforces.com/problemset/problem/28/B

题意:

给一个n,原本有个1到n按顺序排列的序列,给一个序列问,在给一个数组,表示这个位置的数可以换到pi位置,问能不能实现给的那个序列的排列。如果可以输出yes相反输出no

思路:

通过画图可知同一个集合的数字一定可以相互交换位置。所以这里使用并查集就好。

代码:

 #include<bits/stdc++.h>
#define LL long long using namespace std;
const int maxn=+;
struct node
{
int to,Next;
};
int Head[maxn];
node Edge[maxn*];
int cnt=;
int a[maxn],b[maxn],Fa[maxn];
void add(int u,int v)
{
Edge[++cnt].to=v;
Edge[cnt].Next=Head[u];
Head[u]=cnt;
return ;
}
int Find(int x)
{
if(x==Fa[x])
{
return x;
}
else
{
return Fa[x]=Find(Fa[x]);
}
}
int main()
{
int n;
cin>>n;
for(int i=;i<=n;i++)
{
Fa[i]=i;
}
for(int i=;i<=n;i++)
{
cin>>a[i];
}
for(int i=;i<=n;i++)
{
cin>>b[i];
}
for(int i=;i<=n;i++)
{
if(i+b[i]<=n||i-b[i]>=)
{
int root1=Find(i);
if(i+b[i]<=n)
{
int root2=Find(i+b[i]);
if(root1!=root2)
{
Fa[root2]=root1;
}
}
if(i-b[i]>=)
{
int root2=Find(i-b[i]);
if(root1!=root2)
{
Fa[root2]=root1;
}
}
}
}
int flag=;
for(int i=;i<=n;i++)
{
int root1=Find(a[i]);
int root2=Find(i);
if(root1!=root2)
{
//cout<<i<<" "<<a[i]<<endl;
flag=;
break;
}
}
if(flag)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
return ;
}

最新文章

  1. Squirrel: 通用SQL、NoSQL客户端
  2. IntelliJ IDEA的快捷键
  3. HDU 4940 Destroy Transportation system(2014 Multi-University Training Contest 7)
  4. WCF入门 (14)
  5. python 调用 C++ code
  6. Eclipse使用技巧总结
  7. SSH与EJB 比较
  8. Oracle- 存储过程和异常捕捉
  9. LoadRunner测试问题
  10. Terminating app due to uncaught exception &#39;NSUnknownKeyException&#39;, reason: xxxx
  11. 关于链接target的问题
  12. c/c++数组名和指针区别深入探索
  13. USACO Section 1.2 Name That Number 解题报告
  14. CCNA笔记(3)
  15. Win下安装nvm
  16. 《Gogoing》Alpha版会议总结
  17. GCC内置函数
  18. Python实现向s3共享存储上传和下载文件
  19. 性能调优之MySQL篇二:MySQL配置文件My.ini配置文件优化
  20. Recsys2018 music recomendation

热门文章

  1. java NIO socket 通信实例
  2. dataTable获取所有数据
  3. hud2243 考研路茫茫——单词情结
  4. 【记录】使用Navicat将表设计导出数据库设计文档
  5. windows安装 阿里云的Fun工具
  6. Linux系统基于fork()新进程的创建
  7. HTML 地理定位 的实例
  8. Flutter-AppBar
  9. Flutter的生命週期
  10. 转:C++ 11 Lambda表达式