题目:
有一个由 n 个元素组成的序列 a1,a2,…,an;最初,序列中的每个元素满足ai=i。
对于每次操作,你可以交换序列中第 ii 个元素和第 jj 个元素当且仅当满足 |i−j|=di。
题目给出序列 b1,b2,…,bn 和 d1,d2,…,dn,询问是否可以通过若干次交换,使得序列 a 和序列 b 完全相同。
输入格式:
第 1 行一个正整数 n,含义如上。
第 2 行 n 个正整数表示 b1,b2,…,bn。
第 3 行 n 个正整数表示 d1,d2,…,dn。
输出格式:
若能,输出 YES
;否则输出 NO
。
样例输入:
7
4 2 5 1 3 7 6
4 6 6 1 6 6 1
样例输出:
YES
本题我们可以用并查集的方式来写。
1: 首先我们看题目的意思,我们是需要进行x次交换后然后得到顺序为1 2 3 4 ..... n 的序列,因为x是随意的,我们需要判断的是最后我们能不能交换成我们想要的序列,所以我们只需要找到每一位数能和哪些数交换就好了。
2:因为每一个数最多可以和俩个位置上的数进行交换,所以每一个位置上可以得到的数就可以用并查集连接在一起。
代码:
#include<iostream>
const int N = 105;
int a[N] , b[N];
int p[N];
int find_x(int x)
{
return x == p[x] ? x :