题解 CF28B 【pSort】
SmallTownKid · · 题解
看了其他题解的分析,自己思考一番之后想出了一个很简单的思路。
这个题的关键就在于 如何想出要使用并查集。
我们知道,如果
举个例子,
所以,要判断
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,fa[100010],a[100010];
int find(int x)
{
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void unionn(int x,int y)
{
fa[find(x)]=find(y);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
fa[i]=i;
}
for(int i=1;i<=n;i++)
{
int d;
scanf("%d",&d);
if(i-d>0) unionn(i,i-d);
if(i+d<=n) unionn(i,i+d);
}
for(int i=1;i<=n;i++)
{
if(find(i)!=find(a[i]))
{
printf("NO");
return 0;
}
}
printf("YES");
return 0;
}