记录编号 423502 评测结果 AAAAAAAAAA
题目名称 [NOI 2008]假面舞会 最终得分 100
用户昵称 GravatarHallmeow 是否通过 通过
代码语言 C++ 运行时间 0.033 s
提交时间 2017-07-12 06:22:20 内存使用 5.25 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 1000000
#define ll long long
using namespace std;
int m1[N/10+5],m2[N/10+5];
int n,m,vis[N/10+5],dep[N/10+5],zhan[N/10+5],head=0,e;
int tot=0,t[N/10+5],blg[N/10+5],dp=0,adj[N/10+5];
struct node
{
    int v,next,l;
} a[N*2+4];
int gcd(int x,int y){return y? gcd(y,x%y):x;}
inline int read()
{
    int sum=0,f=1;char x=getchar();
    while(x<'0'||x>'9'){if(x=='-')f=-1;x=getchar();}
    while(x>='0'&&x<='9'){sum=sum*10+x-'0';x=getchar();}
    return sum;
}
inline void add(int u,int v,int l)
{
     a[++e].v=v;
     a[e].next=adj[u];adj[u]=e;
     a[e].l=l;
}
inline void dfs(int x,int depp)
{
     zhan[++head]=x;vis[x]=1;dep[x]=depp;blg[x]=dp;
     for(int i=adj[x];i!=-1;i=a[i].next)
     {
          int to=a[i].v;
          if(blg[to])
          {
              if(vis[to]&&zhan[head-1]!=to&&(depp+a[i].l-dep[to]))
                  t[++tot]=abs(depp+a[i].l-dep[to]);
              continue;   
          }       
          dfs(to,depp+a[i].l);
          vis[to]=0;head--;
     }
}
int sb()
{
    freopen("party2008.in","r",stdin);
    freopen("party2008.out","w",stdout);
    memset(adj,-1,sizeof(adj));
    scanf("%d%d",&n,&m);
    int x,y;
    for(int i=1;i<=m;i++)
    {
         x=read();y=read();
         add(x,y,1);
         add(y,x,-1);
    }
    for(int i=1;i<=n;i++)
        if(!blg[i])
        {
              dp++;
              dfs(i,1);
        }
    if(tot)
    {
         int ans=t[1];
         for(int i=2;i<=tot;i++)ans=gcd(ans,t[i]);
         if(ans<3)printf("-1 -1\n");
         else
               for(int i=3;i<=ans;i++)  
                  if(!(ans%i))
                  {
                     printf("%d %d\n",ans,i);
                      break;  
                  }
    }
    else
    {
          int ans=0;
          for(int i=1;i<=n;i++)m1[i]=1<<28;
          for(int i=1;i<=n;i++){
             m1[blg[i]]=min(m1[blg[i]],dep[i]);
             m2[blg[i]]=max(m2[blg[i]],dep[i]);
          }
          for(int i=1;i<=n;i++)
            if(m2[i]!=0)
               ans+=m2[i]-m1[i]+1;
          if(ans<3)printf("-1 -1\n");
          else printf("%d 3\n",ans);
    }
   // while(1); 
}
int sha=sb();
int main(){;}