坑死了......

题意:给你个有向图,你需要把点分成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 假面舞会相关推荐

  1. 洛谷 P1477 [NOI2008]假面舞会

    题目链接 题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方 ...

  2. 洛谷 P1352 没有上司的舞会

    洛谷 P1352 没有上司的舞会 Description 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会, ...

  3. 【c++算法刷题笔记】——洛谷2

    1. 洛谷练习--P1579 哥德巴赫猜想(升级版) 题目描述: 现在请你编一个程序验证哥德巴赫猜想. 先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数. 输入格式: 仅有一行,包含一 ...

  4. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  5. 树形DP Python 洛谷P1352

    树形DP Python 洛谷P1352: 某大学有 n个职员,编号为 1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来 ...

  6. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  7. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  8. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  9. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

最新文章

  1. 初学者怎样看懂python代码_新手入门必看,最常用的Python代码片段
  2. iOS 系统版本判断
  3. Android中使用AlertDialog实现几种不同的对话框
  4. windows下Emacs的安装与配置
  5. VMware ESXi 6.X Syslog日志配置
  6. JAVA入门[14]-Spring MVC AOP
  7. 阶乘因式分解 一 c语言,阶乘因式分解(一)(C/C++语言代码)
  8. 管理新语:软件工作考评的设计思路
  9. 【字符编码】Unicode字符集与字符编码方式
  10. 短除法对一个数分解质因数
  11. 安装域、对域进行管理
  12. 数据结构实验教程-第一套
  13. mysql数据库用sql语句在指定的一个字段后面添加一个字段
  14. 【日常Exception】第二十七回:Caused by: java.sql.SQLException: Incorrect string value: ‘\xF0\xAC\x8C\x97\xE7\x
  15. 单片机 | 51单片机原理
  16. Maven基础简介+安装说明
  17. 腾讯+字节+阿里面经真题汇总,总结到位
  18. 史玉柱深度剖析:民营的13种“死法”
  19. 一文带你了解什么是数学建模
  20. 智慧城市,离我们还有多远?

热门文章

  1. Git 使用juju
  2. Poj 2010-Moo University - Financial Aid
  3. Scapy用法官方文档
  4. 无域名HTTP请求攻击分析
  5. [精华]史上最强买笔记本电脑专业精粹导购指南,让奸商彻底晕菜!
  6. 数组的几种表示的方式
  7. 如何评价1700亿参数的GPT-3?
  8. 重磅《中华人民共和国数据安全法》最全图解附全文
  9. 4 支付宝手机网站支付demo讲解
  10. MSTP多实例配置实验