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.
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.
If the given state is reachable in the described game, output YES, otherwise NO.
5 5 4 3 2 1 1 1 1 1 1
YES
7 4 3 5 1 2 7 6 4 6 6 1 6 6 1
NO
7 4 2 5 1 3 7 6 4 6 6 1 6 6 1
YES
在每个cell与它能交换的cell间连一条边,最后若每个cell与permutation都连通则答案为YES,否则为NO。
#include <iostream> #include <string> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <set> #include <vector> #include <queue> #include <stack> using namespace std; #define max_int INT_MAX / 2 #define max_long 0xFFFFFFFFFFFFFFFLL / 2 #define two(a) (1 << (a)) #define eps 1e-6 #define FF(i, a, b) for (int i = (a); i <= (b); i++) #define FFD(i, a, b) for (int i = (a); i >= (b); i--) const int OO=1e9; const int INF=1e9; int n; vector<int>a[111]; int p[111]; int f[111]; bool g[111][111]; bool ok; bool dfs(int bg,int u,int ed) { g[bg][u]=true; if (u==ed) return true; int len=a[u].size(); int v; FF(i, 0, len-1) { v=a[u][i]; if (!g[bg][v]) { if (dfs(bg,v,ed)) return true; } } return false; } int main() { memset(g,0,sizeof(g)); cin>>n; FF(i, 1, n) { cin>>p[i]; } FF(i, 1, n) { cin>>f[i]; if (i+f[i]<=n) { a[i].push_back(i+f[i]); a[i+f[i]].push_back(i); } if (i-f[i]>=1) { a[i].push_back(i-f[i]); a[i-f[i]].push_back(i); } } ok=true; FF(i ,1, n) { if (!dfs(i,i,p[i])) { ok=false; break; } } if (ok) cout<<"YES"<<endl; else cout<<"NO"<<endl; return 0; }