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的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  3. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  4. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  5. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  6. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  7. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

  8. 【Codeforces 670C】 Cinema

    [题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...

  9. 【codeforces 515D】Drazil and Tiles

    [题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...

随机推荐

  1. canvas-4fillstyle.html

    fillStyle color gradient pattern image canvas video strokeStyle

  2. CSS外观属性

    CSS外观属性 color 文本颜色 line-height 行间距 text-aline水平对齐方式 text-indent 首行缩进 letter-spacing字间距 word-spacing ...

  3. 1788:Pell数列

    1788:Pell数列 查看 提交 统计 提问 总时间限制:  3000ms 内存限制:  65536kB 描述 Pell数列a1, a2, a3, ...的定义是这样的,a1 = 1, a2 = 2 ...

  4. 【读书笔记】iOS-自定义URL Scheme注意事项

    如果两个不同的应用注册了同样的URL Scheme,那么后安装的应用会响应符合这种协议格式的URL. 如果你的应用的iPhone和iPad版是各自独立的(即不是Universal类型的),那么你就不应 ...

  5. layer插件layer.photos()动态插入的图片无法正常显示

    layer插件layer.photos()动态插入的图片无法正常显示,点击后面插入的图片,显示的是之前的图片列表,再次点击又是正常 有朋友遇到同样的问题 http://fly.layui.com/ji ...

  6. SyntaxError: JSON.parse: bad control character in string literal at line 1 column 16 of the JSON data

    JSON.parse转化Json字符串时出现:SyntaxError: JSON.parse: bad control character in string literal at line 1 co ...

  7. Linux 学习笔记之超详细基础linux命令 Part 10

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 9----------------- ...

  8. 《Inside C#》笔记(七) Attribute

    Attribute特性可以说是具有开创新的意义,因为一般的语言在被设计出来后,它所具有的能力就已经固定了.而借助Attribute特性,我们可以为C#已有的类型附加信息,既可以在编程时(design- ...

  9. springboot 升级到2.0后 context-path 配置 不起作用,不生效 不管用 皆是因为版本改动导致的在这里记录一下

    不知不觉,新的项目已经将springboot升级为2.0版本了.刚开始没有配置server.contextpath,默认的“/”,然后今天放到自己的服务器上,所以就要规范名称.  结果,失败了,无论我 ...

  10. 14.python与数据库之mysql:pymysql、sqlalchemy

    相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查 ...