[语言月赛 202404] 神秘排列
题目描述
一个数列是神秘数列当且仅当满足下列条件:
- 这个数列是一个排列。即,整数 $1 \sim n$ 均在这个数列中出现过,且其中的每种整数仅出现过一次(例如,当 $n=4$ 时,$1,2,4,3$ 是一个排列, $1,2,2,2$ 不是一个排列);
- 我们将一个数列中 $x$ 出现的位置(出现在第几个)记作 $p_x$($1 \leq p_x \leq n$),神秘数列需要满足对于 $1 \sim n$ 中的任意一个整数 $i$,都有 $p_i=a_i$。
例如,对序列 $3, 5, 2, 1, 4$,其中 $1$ 的出现位置为 $4$,因此 $p_1 = 4$。但是 $a_1 = 3 \neq p_1$,因此这个序列不是神秘序列。
你的工作是需要判定一个数列 $a_1, a_2, \cdots, a_n$ 是否为神秘数列。
输入格式
第一行一个整数 $n$,表示数列的长度。
第二行 $n$ 个整数 $a_1, a_2, \cdots, a_n$。
输出格式
一个字符串,假如这个数列是神秘数列,则输出 YES
,否则输出 NO
。
样例 #1
样例输入 #1
3
2 1 3
样例输出 #1
YES
样例 #2
样例输入 #2
5
3 5 2 1 4
样例输出 #2
NO
提示
数据规模与约定
对于 $40\%$ 的数据,$1 \leq n \leq 100$。
对于 $70\%$ 的数据,$1 \leq n \leq 2000$。
对于 $100\%$ 的数据,$1 \leq n \leq 105$。
数据保证 $a$ 是一个排列。即,整数 $1 \sim n$ 均在这个数列中出现过,且每种整数仅出现过一次。
个人做法
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n;
vector<int>shuzu(1,0);
cin >> n;
for(int i = 1 ; i <= n ; i++){
int shu;
cin >>shu;
shuzu.push_back(shu);
}
int is_ke = 1;
for (int i = 1;i <=n;i++){
if(shuzu[shuzu[i]]!=i){
is_ke = 0;
break;
}
}
if(is_ke){
cout<<"YES";
}else{
cout<<"NO";
}
return 0;
}