bzoj1064

很巧妙的题

首先有几种情况

1. 有环 2.两点间有多条路径 3.其他

3.显然最简单,最小是3,最大是每个弱联通块中最长链

2.显然,两点间两条路径的差是答案的倍数

1.出现环,那答案一定是其约数,那么最大答案就是所有环长的最大公约数,最小是最大的大于等于3的最小因数

综合以上,我们就有了大概的思路,但是不好处理

有一个精妙的做法,对于每条边添加一个长度为-1的反向边,一下就简单多了

  1 type node=record
  2        po,next,num:longint;
  3      end;
  4
  5 var e:array[0..4000010] of node;
  6     p,d:array[0..200010] of longint;
  7     v:array[0..200010] of boolean;
  8     mi,i,l,r,n,m,len,ans,x,y:longint;
  9
 10 function min(a,b:longint):longint;
 11   begin
 12     if a>b then exit(b) else exit(a);
 13   end;
 14
 15 function max(a,b:longint):longint;
 16   begin
 17     if a>b then exit(a) else exit(b);
 18   end;
 19
 20 function gcd(a,b:longint):longint;
 21   begin
 22     if b=0 then exit(a)
 23     else exit(gcd(b,a mod b));
 24   end;
 25
 26 procedure add(x,y,z:longint);
 27   begin
 28     inc(len);
 29     e[len].po:=y;
 30     e[len].num:=z;
 31     e[len].next:=p[x];
 32     p[x]:=len;
 33   end;
 34
 35 procedure dfs(x:longint);
 36   var i,y:longint;
 37   begin
 38     v[x]:=true;
 39     i:=p[x];
 40     while i<>-1 do
 41     begin
 42       y:=e[i].po;
 43       if v[y] then ans:=gcd(ans,abs(d[x]+e[i].num-d[y]))
 44       else begin
 45         d[y]:=d[x]+e[i].num;
 46         dfs(y);
 47       end;
 48       i:=e[i].next;
 49     end;
 50   end;
 51
 52 procedure find(x:longint);
 53   var i,y:longint;
 54   begin
 55     v[x]:=true;
 56     l:=min(l,d[x]);
 57     r:=max(r,d[x]);
 58     i:=p[x];
 59     while i<>-1 do
 60     begin
 61       y:=e[i].po;
 62       if not v[y] then
 63       begin
 64         d[y]:=d[x]+e[i].num;
 65         find(y);
 66       end;
 67       i:=e[i].next;
 68     end;
 69   end;
 70
 71 begin
 72   len:=-1;
 73   fillchar(p,sizeof(p),255);
 74   readln(n,m);
 75   for i:=1 to m do
 76   begin
 77     readln(x,y);
 78     add(x,y,1);
 79     add(y,x,-1);
 80   end;
 81   for i:=1 to n do
 82     if not v[i] then dfs(i);
 83   if ans<>0 then
 84   begin
 85     mi:=ans;
 86     for i:=3 to ans do
 87       if ans mod i=0 then
 88       begin
 89         mi:=i;
 90         break;
 91       end;
 92   end
 93   else begin
 94     fillchar(v,sizeof(v),false);
 95     for i:=1 to n do
 96       if not v[i] then
 97       begin
 98         d[i]:=0;
 99         l:=0;  r:=0;
100         find(i);
101         ans:=ans+r-l+1;
102       end;
103
104     mi:=3;
105   end;
106   if ans<3 then writeln(‘-1 -1‘) else writeln(ans,‘ ‘,mi);
107 end.

时间: 2024-11-07 07:42:54

bzoj1064的相关文章

[BZOJ1064][Noi2008]假面舞会

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

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,a

BZOJ1064 [Noi2008]假面舞会 【dfs】

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

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

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

bzoj 1061~1065【Noi2008】解题报告

这次Noi好像格外喜欢树形DpQAQ P.S.好像这次的题有4道都与图有关QAQ bzoj1061[Noi2008]志愿者招募:上下界可行最小费用流 bzoj1062[Noi2008]糖果雨:数形结合&二维树状数组 bzoj1063[Noi2008]道路设计:树形Dp bzoj1064[Noi2008]假面舞会:分类讨论&图上Dfs bzoj1065[Noi2008]奥运物流:树形Dp&背包优化Dp

noi 滚cu后7月oi生活

7-24 A了bzoj1001,屯了好久的题,一直没写,写的挺顺利的,做了那么长时间bzoj,都没有把它A掉 网络流,平面图转对偶图,然后跑一下最短路,类似证明貌似像是最大流最小割定理一样,求最大转换为求最小,具体也不知道QAQ 看了一下bzoj1064,想到可能是环的大小的gcd,lcm,然后发现细节好多,根本不会找简单环.然后果断去搜题解,纠结了好一会儿,然后发现了一个新技巧,顿时眼前一片明亮,不过此技巧貌似适用面不广. 对于每条又向边x->y,我们建x->y的边,边权为1,建y->