5
5 4 3 2 1
1 1 1 1 1
7
4 3 5 1 2 7 6
4 6 6 1 6 6 1
7
4 2 5 1 3 7 6
4 6 6 1 6 6 1
n个数 一行数 能排成升序 就输出yes else no 下面一行数是 上面数能移动的距离
万老板的解题思路 \w/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define clr(x) memset(x,0,sizeof(x))
int a[200];
int w[200];
int g[200][200];
int main()
{
int n,i,j,k,flag,t;
while(scanf("%d",&n)!=EOF)
{
flag=0;
clr(g);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d",&w[i]);
for(i=1;i<=n;i++)
g[i][i]=1;
for(i=1;i<=n;i++)
{
if(i+w[i]<=n)
{g[i][i+w[i]]=1;g[i+w[i]][i]=1;}
if(i-w[i]>=1)
{g[i][i-w[i]]=1;g[i-w[i]][i]=1;}
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
g[i][j]=g[i][j]||(g[i][k]&&g[k][j]);
for(i=1;i<=n;i++)
if(g[i][a[i]]==0&&g[a[i]][i]==0)flag=1;
if(flag)printf("NO\n");
else printf("YES\n");
}
return 0;
}