BZOJ1064 NOI2008假面舞会

挺神的这题,发现只有环和链两种情况

搜索时我们只考虑环的,因为链可以看成找不到分类的环。

当成链时大小是的最大值是各链长的和,最小值是3

当成环时最大值是各环长的gcd,最小值是大于3的最小的ans的约数

当有链有环时只有当环的gcd大于等于3时才有解,所以我们统计答案时要优先考虑环的情况,考虑链情况时当且仅当没有环

By:大奕哥

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+10;
 4 int n,m,ans,ans2,pos[N],head[N],cnt,ma[N],mi[N],f[N];
 5 bool v[N];
 6 struct node{
 7     int to,nex,w;
 8 }e[2000005];
 9 void add(int x,int y,int w)
10 {
11     e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;e[cnt].w=w;
12 }
13 int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
14 int get(int x){return x==f[x]?x:f[x]=get(f[x]);}
15 void dfs(int x,int tmp)
16 {
17     ma[tmp]=max(ma[tmp],pos[x]);
18     mi[tmp]=min(mi[tmp],pos[x]);v[x]=1;
19     for(int i=head[x];i;i=e[i].nex)
20     {
21         int y=e[i].to;
22         if(!v[y])
23         {
24             pos[y]=pos[x]+e[i].w;
25             dfs(y,tmp);
26         }
27         else ans=gcd(ans,abs(pos[x]-pos[y]+e[i].w));
28     }
29 }
30 int main()
31 {
32     scanf("%d%d",&n,&m);int x,y;
33     for(int i=1;i<=n;++i)f[i]=i;
34     for(int i=1;i<=m;++i)
35     {
36         scanf("%d%d",&x,&y);
37         add(x,y,1);add(y,x,-1);
38         int fx=get(x),fy=get(y);
39         f[fx]=fy;
40     }
41     memset(mi,0x3f,sizeof(mi));
42     for(int i=1;i<=n;++i)
43         if(!v[i]){
44             dfs(i,get(i));
45         }
46     if(ans<3)
47     {
48         if(!ans)
49         for(int i=1;i<=n;++i)
50         if(f[i]==i)
51         ans+=ma[i]-mi[i]+1;
52         if(ans<3)printf("-1 -1");
53         else
54         printf("%d 3",ans);
55     }
56     else
57     {
58         for(int i=3;i<=ans&&!ans2;++i)
59         if(ans%i==0)ans2=i;
60         printf("%d %d",ans,ans2);
61     }
62     return 0;
63 }

原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8361768.html

时间: 2024-11-05 18:52:47

BZOJ1064 NOI2008假面舞会的相关文章

[BZOJ1064][Noi2008]假面舞会

试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特殊的技术将每个面具的编号标在了面具上,只有戴第i 类面具的人才能看到戴第i+1 类面具的人的编号,戴第k 类面具的人能看到戴第1 类面具的人的编号. 参加舞会的人并不知道有多少类面具,但是栋栋对此却特别好奇,他想自己算出

BZOJ1064 [Noi2008]假面舞会 【dfs】

题目 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特殊的技术将每个面具的编号标在了面具上,只有戴第i 类面具的人才能看到戴第i+1 类面具的人的编号,戴第k 类面具的人能看到戴第1 类面具的人的编号. 参加舞会的人并不知道有多少类面具,但是栋栋对此却特别好奇,他想自己算出有多

【图论 搜索】bzoj1064: [Noi2008]假面舞会

做到最后发现还是读题比赛 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特殊的技术将每个面具的编号标在了面具上,只有戴第i 类面具的人才能看到戴第i+1 类面具的人的编号,戴第k 类面具的人能看到戴第1 类面具的人的编号. 参加舞会的人并不知道有多少类面

BZOJ 1064[NOI2008]假面舞会

1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2044  Solved: 989[Submit][Status][Discuss] Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为k (k≥

图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]

BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1655  Solved: 798[Submit][Status][Discuss] Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为

【BZOJ 1064】 [Noi2008]假面舞会

1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 988  Solved: 507 [Submit][Status] Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特

NOI2008假面舞会

1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 883  Solved: 462[Submit][Status] Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特殊的

【BZOJ】1064: [Noi2008]假面舞会(判环+gcd+特殊的技巧)

http://www.lydsy.com/JudgeOnline/problem.php?id=1064 表示想到某一种情况就不敢写下去了.... 就是找环的gcd...好可怕.. 于是膜拜了题解.. 和我想的差不多.. 首先发现这3几种情况: 1.一条或多条单链,那么最多有sum{单链长度}个面具,最少有3个面具 2.环.主要是大环套小环QAQ,显然我们只要小环就行了QAQ环的长度为标号差,gcd能满足这个性质,因此不管它.找出所有的环即可. 3.链相交.此时最大为相交链的长度差的gcd,最小

[bzoj 1064][NOI2008]假面舞会(dfs判断环)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1064 分析: 如果a看到b,则a->b 那么: 1.如果图中有环,则说明这个环的长度肯定是答案的倍数.所以最大种类数=所有环的长度的gcd,最小种类数=所有环的长度的公约数中>=3的最小数 2.如果图中没有环且都是单独的长链,那么最大种类数=每个联通图中最长链的和,最小种类数=3(如果没有则-1) 3.要考虑一种特殊情况:a->b->c->d a->e-&g