【Codeforces 1137C】Museums Tour
Codeforces 1137 C
题意:给一个有向图,一周有\(d\)天,每一个点在每一周的某些时刻会开放,现在可以在这个图上从\(1\)号点开始随意地走,问最多能走到多少个开放的点。一个点如果重复走到了很多次,只算一次。
思路:这空间太难卡了。。。
我们首先考虑将这个图的所有点都拆成\(d\)个,变成\(n\times d\)个点(为下文卡空间埋下伏笔),
即将\(i\)变成\((i,j)\),其中\(j\)表示到\(i\)的时候是一周的第\(j\)天(这里天数是\(0-start\),即一周的第一天是\(j=0\))
然后将每一条边\(u\rightarrow v\)都变成\((u,i)\rightarrow(v,(i+1)\ mod\ d)\),那么我们就会发现我们要求的就是\((0,0)\)开始我们最多能跑到多少不同的\((i,\star)\)。
所以我们将这个新图强连通分解,对于每一个强连通分量求出这个连通分量中不同的原来点的个数。
为了避免重复计算,我们证明以下结论:
在新图的一条链中出现的所有相同原图节点的节点们必定在同一个新图的强连通分量内。
证明:
首先我们假设这条链中有两个节点\((u,i)\)和\((u,j)\),那么原图上肯定有一个包含\(u\)的环,其长度\(mod\ d\)为\(j-i\),那我们从\((u,j)\)再走\(d-1\)次这个环,肯定回到\((u,i)\)。所以它们两个节点肯定在一个强连通分量内。证毕。
然后我们考虑\(dp(i)\)表示现在走到了第\(i\)个强连通分量,最多能够走到的点的个数。
那么转移就是枚举\(i\rightarrow j\),从\(dp(j)\)转移。
但是,只是这样的话肯定会\(mle\),我们需要卡空间。
我的做法是把所有的关于\(stl\)、递归的东西统统变成手写的,然后就变成了一堆奇奇怪怪的东西:
邻接表我用的是\(vector\),那么不要了!变成前向星!
强连通分解我用的是\(kosaraju\),那么这两个\(dfs\)都不要了!变成手写的递归!
\(dp\)的时候我用的是记忆化搜索,那么这个\(dfs\)也不要了!变成拓扑排序后\(bfs\)!(但是最后还是变成了手写递归-_-
关于手写递归:
首先我们要知道白点、灰点、黑点这三个概念:白点是没有访问过的点,灰点是正在访问的点,黑点是已经访问过了的点。它们分别对应了\(vis\)中的\(0\)、\(1\)、\(2\)。
然后我们手动维护一个调用栈\(stk\),那么我们的\(dfs\)应该是这样的:
// 起始点: s
stk.push(s);
while (!stk.empty()) {
int u = stk.top(); stk.pop();
if (vis[u] == 2) continue;
if (vis[u] == 1) {
// 做正常dfs的时候访问完儿子们后做的事
vis[u] = 2;
continue;
}
for (int v : g[u]) {
if (!vis[v]) stk.push(v);
}
}
十分不优美,但为了卡空间也没什么办法。。。
\(stk\)千万不要用\(std::stack\),肯定会\(tle\)。。。
老老实实手写,如果感觉空间不够也不要用\(vector\)。大胆开不要怂小心地算一个上界开大一点点的(比如加一个微不足道的常数\(10^5\))
【Codeforces 1137C】Museums Tour的更多相关文章
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【codeforces 707E】Garlands
[题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...
- 【codeforces 707C】Pythagorean Triples
[题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...
- 【codeforces 709D】Recover the String
[题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...
- 【codeforces 709B】Checkpoints
[题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...
- 【codeforces 709C】Letters Cyclic Shift
[题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...
- 【Codeforces 429D】 Tricky Function
[题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...
- 【Codeforces 670C】 Cinema
[题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...
- 【codeforces 515D】Drazil and Tiles
[题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...
随机推荐
- spring boot (2):spring boot 打包tomcat、tomcat 部署多个项目、服务器部署项目SSL 设置(阿里云)
一.spring boot 内置tomcat配置https: 关于自签名证书可以看下上一篇 spring boot1 更详细的可以看转载 https://www.jianshu.com/p/8d4ab ...
- link标签链接CSS和@import加载的区别
link:基本语法 <link rel="stylesheet" href="路径"> @import 基本语法 <style> @im ...
- H5新标签(适合新手入门)
H5新标签 文档类型设定 document HTML: sublime 输入 html:4s XHTML: sublime 输入 html:xt HTML5 sublime 输入 html:5 < ...
- SD从零开始62-63,不完全日志,业务伙伴及业务伙伴确定
[原创] SD从零开始62 不完全日志 不完全日志Incompletion log 一个不完全日志是销售凭证中对你公司重要的而还没有在系统中输入的所有数据的清单: 你可以在配置中为不完全日志定义这些数 ...
- PyCharm实现高效远程调试代码
PyCharm实现高效远程调试代码 (薛刚强) 为方便Python代码学习和项目开发,目前选择专业的 IDE 开发工具 ,如 PyCham.针对个人使用的技巧做个笔记,分享给大家,有描述 ...
- HBuilder离线打包启用Chrome Inspect调试
解决方法: 修改这个文件 assets/data/dcloud_control.xml <msc version="1.9.9.39354" debug="true ...
- Android中的padding和margin的区别
在Android的布局中,常常有人将padding和margin搞混,他们其实不一样的,padding是该控件的内部距离. magin是该控件与其他控件之间的距离.例如 <LinearLayou ...
- flask day01
目标:搭建好一个flask架构,并且可以运行起来,能够访问 ## 一丶配置环境 比较简单,只需要配一个flask pip3 install flask #也可以使用pip install flask ...
- OneAPM大讲堂 | Java 异常日志记录最佳实践
[编者按]本文作者是 Casey Dunham.Casey 是一位具有 10 多年经验的专业软件开发人员,以其独特的方式应对应用安全问题而闻名.本文系国内 ITOM 管理平台 OneAPM 工程师编译 ...
- 慕学在线网0.2_users表设计(2)
接着上一篇,我们继续对users表进行完善.其中包括邮箱验证码(EmailVerifyRecord)和轮播图(PageBanner)两个model. 1.编写"models.py" ...