您的位置:首页 > 其它

hdu2270 How Many Friends Will Be Together With You

2016-03-02 13:56 246 查看
仔细看几遍题,就会发现这其实是道傻逼题(一开始推单调性的我应该更加傻逼)。如果a将属于S的b拉走,那么S的变化仅仅是减少了一个元素而已,所以记录每个元素所属的集合以及每个集合的大小即可。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
int ar[1000010],id[1000010],sm[1000010];
bool cl(){
int i,j,k,n;
if(scanf("%d",&n)==-1)return 0;
for(i=1;i<=n;scanf("%d",&ar[i++]))
id[i]=i,sm[i]=1;
for(i=1;i<=n;++i){
if(id[i]==id[ar[i]])continue;
sm[id[i]]++,sm[id[ar[i]]]--;
id[ar[i]]=id[i];
}
printf("%d\n",sm[id[1]]-1);
return 1;
};
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
while(cl());
return 0;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: