解析:
并查集,将能够交换的位置相连。
查看对应的位置能够交换。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=105;
int n,a[N],d[N],p[N],t;
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),p[i]=i;
for(int i=1;i<=n;i++){
scanf("%d",&t);
if(i+t>=1&&i+t<=n){
int x=find(i),y=find(i+t);
if(x!=y) p[x]=y;
}
if(i-t>=1&&i-t<=n){
int x=find(i),y=find(i-t);
if(x!=y) p[x]=y;
}
}
for(int i=1;i<=n;i++){
if(find(i)!=find(a[i])){
puts("NO");
return 0;
}
}
puts("YES");
return 0;
}