记录编号 484561 评测结果 AAAAAAAAAA
题目名称 [NOI 2008]假面舞会 最终得分 100
用户昵称 Gravatar泪寒之雪 是否通过 通过
代码语言 C++ 运行时间 0.068 s
提交时间 2018-01-25 13:55:06 内存使用 1.33 MiB
显示代码纯文本
#pragma GCC optimize("-O2")
#include<bits/stdc++.h>
#define N 100011
#define MARICLE __attribute__((optimize("-O2")))
//#define getchar nc
using namespace std;
int b,n,m,f[N],nf[N],aa,bb,sum,sums,i,a,bbb,anfa,anfb,ans,tmax[N],tmin[N],len,us[N],usmax;
char c;
inline char nc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
MARICLE inline void read (int &x){
	c=getchar();
	for (;!('0'<=c && c<='9');c=getchar());
	for (x=0;('0'<=c && c<='9');) {
		x=x*10+c-'0';c=getchar();} 
}
MARICLE int gcd (int a,int b){
	return b?gcd(b,a%b):a;
}
//int Find(int x){
//	if (x==f[x]) return x;
//	int orz=Find(f[x]); nf[x]+=nf[f[x]]; f[x]=orz; return f[x];
//}
MARICLE inline int Find(int x)
{
    int top,j,next;
    top=x;
    while (top!=f[top]) top=f[top];
    while (top!=x) 
    {
        next=f[x]; f[x]=top;
        j=next;
        do
        {
            nf[x]+=nf[j];
            j=f[j];
        }while (f[j]!=j);
        x=next;
    }
    return top;
}
MARICLE int gg() {
	int ggg=sqrt(ans),llll=0;
	for (i=3;i<=ggg;i++)
	 if (ans%i==0) {
	 	llll=i;break;
	 }
	if (ans%2==0&&llll==0) llll=ans/2;
    if (llll==0)
	 printf("%d %d\n",ans,ans);
	else printf("%d %d\n",ans,llll);
}
MARICLE int main () {
	freopen("party2008.in","r",stdin);
	freopen("party2008.out","w",stdout);
	read(n); read(m);
	for (i=1;i<=n;i++) f[i]=i;
	for (i=1;i<=m;i++)
      {
       read(a); read(bbb);
      	anfa=Find(a);//getfather(a);
      	anfb=Find(bbb);//getfather(bbb);
		if (anfa==anfb) {
			if (nf[a]-nf[bbb]!=-1)  {
				if (ans==0) ans=nf[a]-nf[bbb]+1;
				else
				  ans=gcd(ans,nf[a]-nf[bbb]+1);
			}
		//	 ans=max(ans,nf[a]-nf[bbb]+1);
			
		}
	    if (anfa!=anfb) {
      		f[anfb]=anfa; nf[anfb]=nf[a]-nf[bbb]+1;
		  }
	  }
	  if (ans!=0) {
	  	if (ans<=2) {
	  		printf("-1 -1\n");
	  		return 0;
		  }
		else /* 
		printf("%d %d",ans,ans);*/
		gg();
	  }
	  if (ans==0) {
	  	for (i=1;i<=n;i++) Find(i);
	  	for (i=1;i<=n;i++)
	  	 {
	  	 	tmin[f[i]]=min(tmin[f[i]],nf[i]);
	  	 	tmax[f[i]]=max(tmax[f[i]],nf[i]);
	  	 	us[f[i]]=1;
		   }
		for (i=1;i<=n;i++)
		 if (us[i]==1){
		 	len=max(len,tmax[i]-tmin[i]+1);
		 	usmax+=tmax[i]-tmin[i]+1;
		  } 
		  len=max(len,3);
		  if (usmax<3) {printf("-1 -1\n");return 0;}
		  if (len<=usmax) printf("%d %d\n",usmax,3);
	  }
}