One day n cells of some array decided to play the following game. Initially each cell contains a number which is equal to it's ordinal number (starting from 1 ). Also each cell determined it's favourite number. On it's move i -th cell can exchange it's value with the value of some other j -th cell, if ∣i−j∣=di , where di is a favourite number of i -th cell. Cells make moves in any order, the number of moves is unlimited.
The favourite number of each cell will be given to you. You will also be given a permutation of numbers from 1 to n . You are to determine whether the game could move to this state.
Input
The first line contains positive integer n ( 1<=n<=100 ) — the number of cells in the array. The second line contains n distinct integers from 1 to n — permutation. The last line contains n integers from 1 to n — favourite numbers of the cells.
Output
If the given state is reachable in the described game, output YES, otherwise NO.
思路:
首先初始化获得1~n的元素,并确定各个元素可以同哪一些进行交换。
核心的就是find()函数,相当于是溯源。
只要前后俩个的源头一样就可以互相交换。
#include<iostream>
using namespace std;
const int N=1e4;
int n;
int a[N+5],d[N+5],f[N+5];
void init()
{
for(int i=1;i<=N;i++)
f[i]=i;
}
int find(int k)
{
if(f[k]==k)
return k;
return f[k]=find(f[k]);
}
int main()
{
init();
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>d[i];
int x,y;
x=i+d[i];
y=i-d[i];
if(x<=n)
{
f[find(x)]=find(i);
}
if(y>=1)
{
f[find(y)]=find(i);
}
}
for(int i=1;i<=n;i++)
{
int k=a[i];
if(find(k)!=find(i))
{
cout<<"NO";
return 0;
}
}
cout<<"YES";
return 0;
}