B. Fixed Points
水题 求n个0~n-1的数字他们所在的位置等于自身数值的个数。
分别记录位置和数值,找的两个交换成立则+2,否则有一个可换+1,具体看代码。
附AC代码:
#include<bits/stdc++.h> using namespace std; int a[100010],b[100010]; int main(){ memset(a,-1,sizeof(a)); memset(b,-1,sizeof(b)); int n; int flag1=0; cin>>n; int ans=0; for(int i=0;i<n;i++){ cin>>a[i]; if(a[i]!=i){ b[i]=a[i]; flag1=1; } else{ ans++; } } int flag=0; for(int i=0;i<n;i++){ if(a[i]!=i){ if(a[b[i]]==i){ flag=1; break; } } } if(flag==1){ ans+=2; cout<<ans<<endl; } else{ if(flag1==0){ cout<<ans<<endl; } else{ ans++; cout<<ans<<endl; } } return 0; }