洛谷 P1477 [NOI2008]假面舞会
题目链接
题目描述
一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会。
今年的面具都是主办方特别定制的。每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具。每个面具都有一个编号,主办方会把此编号告诉拿该面具的人。
为了使舞会更有神秘感,主办方把面具分为\(k(k≥3)\)类,并使用特殊的技术将每个面具的编号标在了面具上,只有戴第\(i\) 类面具的人才能看到戴第\(i+1\) 类面具的人的编号,戴第\(k\) 类面具的人能看到戴第1 类面具的人的编号。
参加舞会的人并不知道有多少类面具,但是栋栋对此却特别好奇,他想自己算出有多少类面具,于是他开始在人群中收集信息。
栋栋收集的信息都是戴第几号面具的人看到了第几号面具的编号。如戴第2号面具的人看到了第5 号面具的编号。栋栋自己也会看到一些编号,他也会根据自己的面具编号把信息补充进去。
由于并不是每个人都能记住自己所看到的全部编号,因此,栋栋收集的信 息不能保证其完整性。现在请你计算,按照栋栋目前得到的信息,至多和至少有多少类面具。由于主办方已经声明了\(k≥3\),所以你必须将这条信息也考虑进去。
输入输出格式
输入格式:
第一行包含两个整数n, m,用一个空格分隔,n 表示主办方总共准备了多少个面具,m 表示栋栋收集了多少条信息。接下来m 行,每行为两个用空格分开的整数a, b,表示戴第a 号面具的人看到了第b 号面具的编号。相同的数对a, b 在输入文件中可能出现多次。
输出格式:
包含两个数,第一个数为最大可能的面具类数,第二个数为最小可能的面具类数。如果无法将所有的面具分为至少3 类,使得这些信息都满足,则认为栋栋收集的信息有错误,输出两个-1。
输入样例#1
6 5
1 2
2 3
3 4
4 1
3 5
输出样例#1:
4 4
输入样例#2:
3 3
1 2
2 1
2 3
输出样例#2:
-1 -1
说明
50%的数据,满足\(n ≤ 300, m ≤ 1000\);
100%的数据,满足\(n ≤ 100000, m ≤ 1000000\)。
题解
显然,
①如果有多个点指向同一个点,那么他们属于同一类别。
②一个点看到的所有点是一个种类。
那么我们可以吧以上情况缩一下,具体就是给每个关系构一条-1的反边
然后就在这条图上操作
可以发现图上会有环和链
对于链,不管\(k\)取多少都可以满足
对于环,\(k\)满足是环上点数的约数
那么有环的情况,最大就为所以环点数的\(gcd\)
没环就是所有链的长度和
对于最小的\(k\), 答案为最小的\(k(k \geq 3)\)满足 \(k\)为所有环大小的约数
如果没环,答案为\(3\)
Code
#include<bits/stdc++.h>
#define LL long long
#define RG register
using namespace std;
inline int gi() {
int f = 1, s = 0;
char c = getchar();
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') f = -1, c = getchar();
while (c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();
return f == 1 ? s : -s;
}
const int N = 100010;
struct node {
int to, next, w;
}g[2000010];
int last[N], gl;
void add(int x, int y, int z) {
g[++gl] = (node) {y, last[x], z};
last[x] = gl;
return ;
}
inline int gcd(int a, int b) {
return !b ? a : gcd(b, a%b);
}
int cnt, Max[N], Min[N], dis[N], ans1, ans2;
bool flag[N];
void dfs(int u) {
flag[u] = 1;
Max[cnt] = max(Max[cnt], dis[u]);
Min[cnt] = min(Min[cnt], dis[u]);
for (int i = last[u]; i; i = g[i].next) {
int v = g[i].to;
if (!flag[v]) {
dis[v] = dis[u]+g[i].w;
dfs(v);
}
else {
if (!ans1) ans1 = abs(dis[u]+g[i].w-dis[v]);
else ans1 =P3616 富金森林公园 gcd(ans1, abs(dis[u]+g[i].w-dis[v]));
}
}
return ;
}
int main() {
int n = gi(), m = gi();
for (int i = 1; i <= m; i++) {
int u = gi(), v = gi();
add(u, v, 1); add(v, u, -1);
}
memset(Min, 127/3, sizeof(Min));
for (int i = 1; i <= n; i++)
if (!flag[i])
++cnt, dfs(i);
if (!ans1) {
for (int i = 1; i <= cnt; i++)
ans1 += Max[i]-Min[i]+1;
if (ans1 < 3)
printf("-1 -1\n");
else printf("%d 3\n", ans1);
return 0;
}
if (ans1 < 3) {
printf("-1 -1\n");
return 0;
}
printf("%d ", ans1);
for (int i = 3; i <= ans1; i++)
if (ans1 % i == 0) {
printf("%d\n", i);
return 0;
}
return 0;
}
洛谷 P1477 [NOI2008]假面舞会的更多相关文章
- Luogu P1477 [NOI2008]假面舞会
一道非常神奇的图论题解法无比新奇清新 我们首先把图分成三种情况: 有环的,此时答案一定是环长的因数(否则不能满足题意) 存在入度大于1的DAG图的 一棵树/一条链 很容易发现,最后一种情况想怎么取就怎 ...
- 【洛谷】1477:[NOI2008]假面舞会【图论】
P1477 [NOI2008]假面舞会 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具 ...
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1655 Solved: 798[Submit][S ...
- [BZOJ1064][Noi2008]假面舞会
[BZOJ1064][Noi2008]假面舞会 试题描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢 ...
- NOI2008假面舞会
1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 883 Solved: 462[Submit][Status] ...
- 【BZOJ1064】[Noi2008]假面舞会 DFS树
[BZOJ1064][Noi2008]假面舞会 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择 ...
- 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链
luogu 1477 [NOI2008] 假面舞会 容易发现: 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) . 如果有环,则面具种数一定是所有环的大小的最大公约数. ...
- 1064: [Noi2008]假面舞会 - BZOJ
Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办 ...
- 【BZOJ】1064: [Noi2008]假面舞会(判环+gcd+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 表示想到某一种情况就不敢写下去了.... 就是找环的gcd...好可怕.. 于是膜拜了题解.. ...
随机推荐
- rsa 数学推论
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化 而生动的描述,使得高深的数学理论能够被容易地理解.我们 ...
- mfs测试
续1 6. 参考文献: 6.1 文献 http://sery.blog.51cto.com/10037/263515 田逸 http://bbs.chinaunix.net/thread-16438 ...
- php扩展开发1--添加函数
目标:便携php扩展 要求实现 输出hello word 首先用的是php7.0.3 centos7.1或者centos6.+ 1.1 RPM安装PHP rpm -Uvh https://mirr ...
- 747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数
[抄题]: In a given integer array nums, there is always exactly one largest element. Find whether the l ...
- sed陷阱
sed陷阱: sed -i 后不要紧跟字母, 否则会产生一个新的备份文件(在原文件后多出来一个字母) // 正确写法 /usr/bin/sed -i "/PREFIX=/d" ...
- 半平面交 (poj 1279(第一道半平面NlogN)完整注释 )
半平面交的O(nlogn)算法(转载) 求n个半平面的交有三种做法: 第一种就是用每个平面去切割已有的凸多边形,复杂度O(n^2). 第二种就是传说中的分治算法.将n个半平面分成两个部分,分别求完交之 ...
- HDU 4111 Alice and Bob (博弈+记忆化搜索)
题意:给定 n 堆石头,然后有两种操作,一种是把从任意一堆拿走一个,另一种是把一个石子放到另一堆上. 析:整体看,这个题真是不好做,dp[a][b] 表示有 a 堆1个石子,b个操作,操作是指把其他的 ...
- MySQL性能调优与架构设计——第8章 MySQL数据库Query的优化
第8章 MySQL数据库Query的优化 前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 ...
- C++ 虚基类 派生与继承
在学习设计模式时我就有一个疑问,关联和继承除了用法上的区别,好像在内存上并没有什么区别,继承也是父类作为了子类的元素(内存上),关联也是这样.而且关联好像更占内存一些.这就是设计模式里问题了“依赖倒转 ...
- poj1860 Currency Exchange(spfa判断正环)
Description Several currency exchange points are working in our city. Let us suppose that each point ...