直接并查集即可.
#include <bits/stdc++.h> using namespace std; const int N=105; int fa[N],a[N],d[N]; int f(int x) { if(x==fa[x]) return x; else return fa[x]=f(fa[x]); } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&d[i]); for(int i=1;i<=n;i++) fa[i]=i; //同一个祖先的点可以相互交换.. for(int i=1;i<=n;i++) { int tx=i+d[i],ty=i-d[i]; if(tx<=n) { if(f(i)!=f(tx)) { fa[f(tx)]=f(i); } } if(ty>0) { if(f(i)!=f(ty)) { fa[f(ty)]=f(i); } } } int flag=1; for(int i=1;i<=n;i++) { if(f(a[i])!=f(i)) flag=0; } flag==1?puts("YES"):puts("NO"); return 0; }