神秘排列求调

学术版

@[__xsy2013__](/user/575714) ~~我的天呐,你这是什么神奇解法~~你直接vis数组判断掉排列再判断a[a[i]]是否等于i不就行了嘛
by CangerYumo @ 2024-04-19 21:05:22


其实不用那么复杂,直接按题目描述里的式子写if就行了 ``` #include <iostream> using namespace std; int main() { int n, a[100001], position[100001]; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); position[a[i]] = i; } for (int i = 1; i <= n; i++) if (a[i] != position[i]) { printf("NO"); return 0; } printf("YES"); return 0; } ```
by xcjsb @ 2024-04-19 21:06:06


@[CangerYumo](/user/847286) @[xcjsb](/user/920435) 谢谢,我这种人就这样
by __xsy2013__ @ 2024-04-19 21:06:51


其实可以前缀和每个字符
by run_away @ 2024-04-19 21:15:25


```cpp #include <bits/stdc++.h> using namespace std; int n,a[100050],p[100050]; int main(){ scanf("%d",&n); for (int i = 1; i <= n; i++) scanf("%d",&a[i]); for (int i = 1; i <= n; i++) p[a[i]] = i; for (int i = 1; i <= n; i++) { if (a[i] != p[i]) { printf("NO"); return 0; } } printf("YES"); return 0; } ```
by liuruiqing @ 2024-04-19 21:15:55


~~(本蒟蒻的解法)~~ ```cpp #include<bits/stdc++.h> #define ll long long using namespace std; int main() { int n,a[100005]; bool ck=0; memset(a,0,sizeof(a)); cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { if(i!=a[a[i]]) { ck=1; break; } } if(ck) cout<<"NO"; else cout<<"YES"; } ```
by Ravener @ 2024-04-19 21:18:42


|