[补档][NOI 2008]假面舞会
[NOI 2008]假面舞会
题目
一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会。今年的面具都是主办方特别定制的。每个参加舞会的人都可以在入场时选择一个自己喜欢的面具。
每个面具都有一个编号,主办方会把此编号告诉拿该面具的人。为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特殊的技术将每个面具的编号标在了面具上,只有戴第i 类面具的人才能看到戴第i+1 类面具的人的编号,戴第k 类面具的人能看到戴第1 类面具的人的编号。
参加舞会的人并不知道有多少类面具,但是栋栋对此却特别好奇,他想自己算出有多少类面具,于是他开始在人群中收集信息。
栋栋收集的信息都是戴第几号面具的人看到了第几号面具的编号。如戴第2号面具的人看到了第5 号面具。栋栋自己也会看到一些编号,他也会根据自己的面具编号把信息补充进去。由于并不是每个人都能记住自己所看到的全部编号,因此,栋栋收集的信 息不能保证其完整性。现在请你计算,按照栋栋目前得到的信息,至多和至少有多少类面具。由于主办方已经声明了k≥3,所以你必须将这条信息也考虑进去。INPUT
输入文件第一行包含两个整数n, m,用一个空格分隔,n 表示主办方总共准备了多少个面具,m 表示栋栋收集了多少条信息。
接下来m 行,每行为两个用空格分开的整数a, b,表示戴第a 号面具的人看到了第b 号面具。相同的数对a, b 在输入文件中可能出现多次。OUTPUT
输出文件包含两个数,第一个数为最大可能的面具类数,第二个数为最小可能的面具类数。如果无法将所有的面具分为至少3 类,使得这些信息都满足,则认为栋栋收集的信息有错误,输出两个-1。
SAMPLE
INPUT1
6 5
1 2
2 3
3 4
4 1
3 5OUTPUT1
4 4
INPUT2
3 3
1 2
2 1
2 3OUTPUT2
-1 -1
解题报告
当时考试的时候,一看这种带顺序的类似图论的奇怪东西,就想到了拓扑排序
然后......
并不会打拓扑啊QAQ,于是打了个奇(chun)奇(dao)怪(bao)怪(zha)的dfs,好像拿了个特判的-1 -1的分QAQ
正解仍然是dfs
由题目可知,从一个点连出去的点标号一样,几个点指向同一个点,标号也肯定一样。而且,有一句很重要的话:
戴第k 类面具的人能看到戴第1 类面具的人的编号。
那么如果我们找到了环,并将所有环的GCD找出来,我们就找到了最大值。正确性显然= =
如果没有环呢?
显然我们还可以找到链,而链则不会受到上面那个条件的制约,我们就可以很轻松的解决这个问题啦。
然而我们似乎忘记了一个很神奇的东西= =
当我们遇到有各种方向边的环时,显然通过上面的证明,会有第一个点有多个不同标号的情况,这是不可能的,所以,只能看作是不停的由第k个点看第一个点的特殊情况。
如何处理?
很简单,设某个方向边组成的那半个环为ax+k=b的循环,另一个方向边组成的那半个环为cx+k=b的循环。(这里的循环指从第一个点一直走到第k个点再走回第一个点)。显然环是要一样大的,而多出n个环数的点数也应是一样大的(不然起点或终点就会有不止一个标号)。
所以,我们只需建双向边,正边权值1,反边权值-1,最后取个绝对值,就可当正常环看待了(正确性显然= =)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
inline int read(){
int sum();
char ch(getchar());
while(ch<''||ch>'')
ch=getchar();
while(ch>=''&&ch<=''){
sum=sum*+ch-'';
ch=getchar();
}
return sum;
}
struct edge{
int s,e,n,w;
}a[];
int pre[],tot;
inline void insert(int s,int e,int w){
a[++tot].s=s;
a[tot].e=e;
a[tot].w=w;
a[tot].n=pre[s];
pre[s]=tot;
}
inline void swp(int &a,int &b){
a^=b;
b^=a;
a^=b;
}
/*inline int gcd(int a,int b){
//cout<<a<<' '<<b<<endl;
if(a==0)
return b;
if(b==0)
return a;
int i,j;
for(i=0;0==(a&1);i++)
a>>=1;
for(j=0;0==(b&1);j++)
b>>=1;
if(j<i)
i=j;
while(1){
if(a<b)
swp(a,b);
if(0==(a-=b))
return b<<i;
while(a&1)
a>>=1;
}
}*/
inline int gcd(int a,int b){
if(a==)
return b;
if(b==)
return a;
return a%b?gcd(b,a%b):b;
}
inline int jdz(int x){
return x>=?x:-x;
}
inline int my_min(int a,int b){
return a<b?a:b;
}
inline int my_max(int a,int b){
return a>b?a:b;
}
int n,m;
bool vis[]={};
int f[]={};
int mx,mn;
int circle(),ans();
inline void dfs(int u,int cnt){
if(vis[u])
return;
f[u]=cnt;vis[u]=;
mx=my_max(mx,cnt);
mn=my_min(mn,cnt);
for(int i=pre[u];i!=-;i=a[i].n){
int e(a[i].e);
if(vis[e]){
int cir(jdz(cnt-f[e]+a[i].w));
if(cir){
if(circle==)
circle=cir;
else
circle=gcd(circle,cir);
}
}
else
dfs(e,cnt+a[i].w);
}
}
int main(){
// freopen("party2008.in","r",stdin);
// freopen("party2008.out","w",stdout);
memset(pre,-,sizeof(pre));
n=read(),m=read();
for(int i=;i<=m;i++){
int x(read()),y(read());
insert(x,y,);
insert(y,x,-);
}
for(int i=;i<=n;i++)
if(!vis[i]){
mx=-0x7fffffff;
mn=0x7fffffff;
dfs(i,);
ans+=mx-mn+;
}
if(circle==){
if(ans<){
printf("-1 -1");
return ;
}
else{
printf("%d %d",ans,);
return ;
}
}
else{
if(circle<){
printf("-1 -1");
return ;
}
else{
printf("%d ",circle);
int gg();
for(int i=;i<=circle;i++){
if(circle%i==){
gg=i;
break;
}
}
if(gg==)
printf("%d",circle);
else
printf("%d",gg);
}
}
}
ps:一直在WA,最后发现是GCD打错了= =
[补档][NOI 2008]假面舞会的更多相关文章
- NOI 2008 假面舞会
题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号 ...
- [补档][HNOI 2008]GT考试
[HNOI 2008]GT考试 题目 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字. 他的不吉利数学A1A2... ...
- [补档][JLOI 2017]聪明的燕姿
[NOI 2008]假面舞会 题目 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 ...
- Codevs 1800 假面舞会 2008年NOI全国竞赛
1800 假面舞会 2008年NOI全国竞赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一年一度的假面舞会又开始了,栋栋也 ...
- BZOJ 1064 假面舞会(NOI2008) DFS判环
此题,回想Sunshinezff学长给我们出的模拟题,原题啊有木有!!此处吐槽Sunshinezff爷出题不人道!! 不过也感谢Sunshinezff学长的帮助,我才能做出来.. 1064: [Noi ...
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1655 Solved: 798[Submit][S ...
- [BZOJ1064][Noi2008]假面舞会
[BZOJ1064][Noi2008]假面舞会 试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢 ...
- 1064: [Noi2008]假面舞会 - BZOJ
Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...
- NOI2008假面舞会
1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 883 Solved: 462[Submit][Status] ...
随机推荐
- PHP完成一个日历
今天我们就用php中的数组合date 做一个日历. 先让我们回顾一下PHP里面的date . 1.时间戳:表示从计算机元年/UNIX纪年(0时区 1970/1/1 00:00:00)到当前事件的秒数. ...
- 关于MATLAB处理大数据坐标文件2017527
第一次提交数据: 今天用了8个特征,加上的这一个特征是 从3000条测试数据中测试失败的数据总结出来的树的数目为50再次使用3000条测试数据测试结果-- 结果不错: 99%但是运行官网数据结果分数- ...
- 持续集成篇-- SonarQube代码质量管理平台的安装
视频教程:http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53 IP:192.168.4.221 环境:CentOS 6 ...
- mysql 转义字符
在用户提交表单的时候,有的用户会提交一些特殊字符,比如单引号双引号,此时,如果直接按正常字符串插入数据库的话,可能会出现无法正确插入数据库 PDO::quote 转义mysql语句中的单引号和双引号 ...
- laravel如何向视图传递变量的方法
第一种: public function about(){ $name = "cai" return view("sites.about")->with( ...
- JS综合练习
练习一.任意数求和(最多输入十位数),输入999终止 运行代码 <!DOCTYPE html><html> <head> <meta charset=&quo ...
- 用maven创建工程
用maven创建工程 开始 mvn archetype:generate 遇到问题:冗长的工程原型列表和等待时间 改进 mvn archetype:generate -DarchetypeCatalo ...
- vijos1027题解
题目: 当大家在考场中接受考验(折磨?)的时候,小呆正在悠闲(欠扁)地玩一个叫"最初梦想"的游戏.游戏描述的是一个叫pass的有志少年在不同的时空穿越对抗传说中的大魔王chines ...
- Host 'hello-PC' is not allowed to connect to this MySQL server远程连接mysql授权
问题:"Host 'admin-PC' is not allowed to connect to this MySQLserver" (其中,admin-PC为我的机器名) 原 ...
- Eclipse工程有乱码
处理:把整个工程的“Text file encoding”属性设为GBK,就不会有乱码了.设置方法:在eclipse中右击工程,点击弹出框最下面的“Properties”,然后在弹出的窗口左侧点击“R ...