洛谷P1477 假面舞会
坑死了......
题意:给你个有向图,你需要把点分成k种,满足每条边都是分层的(从i种点连向i + 1种点,从k连向1)。
要确保每种点至少有一个。
求k的最大值,最小值。
n <= 1e5, m <= 1e6, k >= 3。
解:
首先可以发现,如果存在一个环,那么k一定是环长的约数。
然后我们把所有环长的gcd求出来就行了......
考虑这几种情况:
情况①:
这启示我们要拓扑排序或建反向边。鉴于这个图可能有环,我们建长度为-1的反向边。
情况②:
这个红色的环怎么办?
事实上只要别的两个环满足了,这个组合起来的环也能够被满足(意会一下)。
情况⑨:
这启示我们在无环/环长全部为0的时候进行特殊处理。
然后写代码的时候出了一堆错......50分暴力发现比正解还难打,不会写......
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 5 const int N = 100010, M = 1000010, INF = 0x3f3f3f3f; 6 7 struct Edge { 8 int nex, v, len; 9 }edge[M << 1]; int top = 1; 10 11 int e[N], m, n, vis[N], small, large, fd, g; 12 13 int gcd(int a, int b) { 14 if(!b) { 15 return a; 16 } 17 return gcd(b, a % b); 18 } 19 20 inline void add(int x, int y, int z) { 21 top++; 22 edge[top].nex = e[x]; 23 edge[top].len = z; 24 edge[top].v = y; 25 e[x] = top; 26 return; 27 } 28 29 void DFS(int x, int in_e) { // error : in_edge space 30 small = std::min(small, vis[x]); 31 large = std::max(large, vis[x]); 32 //printf("vis[%d] = %d \n", x, vis[x]); 33 for(int i = e[x]; i; i = edge[i].nex) { 34 if((i ^ 1) == in_e) { 35 continue; 36 } 37 int y = edge[i].v; 38 if(vis[y] == INF) { 39 vis[y] = edge[i].len + vis[x]; 40 DFS(y, i); 41 } 42 else { 43 int cir = abs(edge[i].len + vis[x] - vis[y]); // error : abs(vis[x] - vis[y]) + 1 44 //printf(">_< >>> [%d]%d [%d]%d \n", x, vis[x], y, vis[y]); 45 //printf("cir = %d \n", cir); 46 g = gcd(g, cir); 47 fd = 1; 48 } 49 } 50 return; 51 } 52 53 int main() { 54 55 scanf("%d%d", &n, &m); 56 for(int i = 1, x, y; i <= m; i++) { 57 scanf("%d%d", &x, &y); 58 add(x, y, 1); 59 add(y, x, -1); 60 } 61 memset(vis, 0x3f, sizeof(vis)); 62 int lenth = 0; 63 for(int i = 1; i <= n; i++) { 64 if(vis[i] == INF) { 65 large = small = 1; 66 vis[i] = 1; 67 DFS(i, 0); 68 lenth += large - small + 1; 69 } 70 } 71 72 //printf("fd = %d \n", fd); 73 74 if(!fd || !g) { // error : !g space 75 if(n <= 2 || lenth <= 2) { // error : lenth <= 2 space 76 printf("-1 -1"); 77 } 78 else { 79 printf("%d 3", lenth); 80 } 81 return 0; 82 } 83 if(g < 3) { 84 printf("-1 -1"); 85 } 86 else { 87 printf("%d ", g); 88 for(int i = 3; i <= g; i++) { 89 if(g % i == 0) { 90 printf("%d", i); 91 break; 92 } 93 } 94 } 95 96 return 0; 97 }
AC代码
太毒瘤了......
转载于:https://www.cnblogs.com/huyufeifei/p/10026779.html
洛谷P1477 假面舞会相关推荐
- 洛谷 P1477 [NOI2008]假面舞会
题目链接 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方 ...
- 洛谷 P1352 没有上司的舞会
洛谷 P1352 没有上司的舞会 Description 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会, ...
- 【c++算法刷题笔记】——洛谷2
1. 洛谷练习--P1579 哥德巴赫猜想(升级版) 题目描述: 现在请你编一个程序验证哥德巴赫猜想. 先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数. 输入格式: 仅有一行,包含一 ...
- 洛谷 深基 第4部分 基础数学与数论(19-21课)
洛谷 深基 第4部分 基础数学与数论 第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...
- 树形DP Python 洛谷P1352
树形DP Python 洛谷P1352: 某大学有 n个职员,编号为 1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来 ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- 洛谷 P1142 轰炸
洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...
- 洛谷 P1387 最大正方形
P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...
- 洛谷P2763 试题库问题
题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...
最新文章
- 初学者怎样看懂python代码_新手入门必看,最常用的Python代码片段
- iOS 系统版本判断
- Android中使用AlertDialog实现几种不同的对话框
- windows下Emacs的安装与配置
- VMware ESXi 6.X Syslog日志配置
- JAVA入门[14]-Spring MVC AOP
- 阶乘因式分解 一 c语言,阶乘因式分解(一)(C/C++语言代码)
- 管理新语:软件工作考评的设计思路
- 【字符编码】Unicode字符集与字符编码方式
- 短除法对一个数分解质因数
- 安装域、对域进行管理
- 数据结构实验教程-第一套
- mysql数据库用sql语句在指定的一个字段后面添加一个字段
- 【日常Exception】第二十七回:Caused by: java.sql.SQLException: Incorrect string value: ‘\xF0\xAC\x8C\x97\xE7\x
- 单片机 | 51单片机原理
- Maven基础简介+安装说明
- 腾讯+字节+阿里面经真题汇总,总结到位
- 史玉柱深度剖析:民营的13种“死法”
- 一文带你了解什么是数学建模
- 智慧城市,离我们还有多远?