直接并查集即可.
#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;
}

京公网安备 11010502036488号