1、题目链接:http://codeforces.com/contest/347/problem/B
2、我怎么又做了画蛇添足的事。。。在flag1=true之后直接break了,只是为了提高一点点效率。。。可是这样做的话,后面那些“正常”的fixed的点都被忽略了。。。奇怪的是系统数据居然过了。。。结果到最后果断被hack数据干掉了。。。
#include<cstdio>using namespace std;
int a[100010];
int main()
{
int n,cnt;
bool flag1,flag2;
while(scanf("%d",&n)==1){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
cnt=0;flag1=flag2=false;
for(int i=0;i<n;i++){
if(a[i]==i) cnt++;
else{
if(a[a[i]]==i) flag1=true;
else flag2=true;
}
}
if(flag1) printf("%d\n",cnt+2);
else if(flag2) printf("%d\n",cnt+1);
else printf("%d\n",cnt);
}
return 0;
}