CF 1138 E. Museums Tour】的更多相关文章

E. Museums Tour 链接 分析: 按时间建出分层图,每个点形如(u,t),表示u在在t个时刻的点,tarjan缩点.每个强连通分量中的点都能经过,然后DAG上dp. 代码: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> #include<cctype> #include<set>…
CF1137 C. Museums Tour 一般来说的正常思路:看到有向图的第一思路都是缩点(但是要分析一波证明强联通分量中的个体可以拼凑成整体,一般都是边和点可以经过无数次然后贡献只算一次这种类型)\(DAG\)上面DP. 这道题第一眼看上去比较麻烦,因为这个时间限制比较恶心的样子. 我们考虑拆点,将一个点拆成\(d\)个,\((i,j)\)表示第\(i\)个点在第\(j\)天的联通情况 这样的话,我们在缩点的时候,就统计一下每一个强联通分量内有多少点在其对应的博物馆的开放时间内(注意去重)…
好题,神题. 题目链接:CF原网 洛谷 题目大意: 一个国家有 $n$ 个城市,$m$ 条有向道路组成.在这个国家一个星期有 $d$ 天,每个城市有一个博物馆. 有个旅行团在城市 $1$ 出发,当天是星期一.每天早上,如果这个城市的博物馆开了,那么可以去这个博物馆参观.每天晚上,旅行团可以选择沿一条出边前往下一个城市,或者结束旅行.一个城市可以经过多次. 请问旅行团最多能参观多少个博物馆.一个博物馆参观了多次,只计算一次. $1\le n,m\le 10^5,1\le d\le 50$. 根据题…
Codeforces 1137 C 题意:给一个有向图,一周有\(d\)天,每一个点在每一周的某些时刻会开放,现在可以在这个图上从\(1\)号点开始随意地走,问最多能走到多少个开放的点.一个点如果重复走到了很多次,只算一次. 思路:这空间太难卡了... 我们首先考虑将这个图的所有点都拆成\(d\)个,变成\(n\times d\)个点(为下文卡空间埋下伏笔), 即将\(i\)变成\((i,j)\),其中\(j\)表示到\(i\)的时候是一周的第\(j\)天(这里天数是\(0-start\),即一…
思路 强连通分量的好题 对于每个博物馆,因为时间的限制条件,不好直接统计, 发现d很小,可以建出d层分层图,原图<u,v>的边变成<u,i>到<v,i+1>的边,<u,n>变成<v,1>的边,然后跑SCC,拆出每个点权值就是这个点这个时间有无贡献,此时一个强连通分量全选就能获得最大的价值了,然后注意同一个i只会出现在一个SCC中且只能被统计一次,所以要去下重 代码 #include <cstdio> #include <algo…
F. Cooperative Game 链接 题意: 有10个玩家,开始所有玩家在home处,每次可以让一些玩家沿着边前进一步,要求在3(t+c)步以内,到达终点. 分析: 很有意思的一道题.我们构造一种走的方式,设玩家有A,B和剩下的. 1.首先A走一步,然后A,B同时走一步,直到AB相遇.(A,B一定会相遇,A先进入环上,然后B进入环上后,没此操作AB之间的距离减少1) 2.然后A,B,和剩下的所有玩家同时走,直到相遇.相遇的点就是要找到的点. 为什么这样是对的? 设B进入环上后又走了x步,…
link \(\text{Description:}\) 一个国家有 \(n\) 个城市,\(m\) 条有向道路组成.在这个国家一个星期有 \(d\) 天,每个城市有一个博物馆. 有个旅行团在城市 \(1\) 出发,当天是星期一.每天早上,如果这个城市的博物馆开了,那么可以去这个博物馆参观.每天晚上,旅行团可以选择沿一条出边前往下一个城市,或者结束旅行.一个城市可以经过多次. 请问旅行团最多能参观多少个博物馆.一个博物馆参观了多次,只计算一次. \(1\le n, m\le 10^5,1\le…
题意和思路看这篇博客就行了:https://www.cnblogs.com/cjyyb/p/10507937.html 有个问题需要注意:对于每个scc,只需要考虑进入这个scc的时间即可,其实和从哪个点进没有关系,因为scc内每个点都可以互相到达,所以只需记录时间就囊括了所有的情况,比如时间3从1号点进和时间4从2号点进是等价的,这也是为什么可以随便选择一颗生成树的原因.对于scc的出边,边的长度是val[u] + val[v] - 1,因为假设从scc x的根 到点scc y的点v,时间是v…
https://codeforc.es/contest/1137/problem/C # 题意 给你n个点,每个点有k天博物馆开放时间的安排表. 有m条单向道路,走过一条边需要一个晚上,经过后就是第二天的意思. 问在无穷大的时间里,可以参观多少不同的博物馆. # 思路 我们把每个点都拆出k个点,有单向边相连就从(u,i) -> (v, (i+1)%k). 缩点跑出DAG,然后DP出最多的博物馆参观数. 这里就要考虑直接DP是否能行.假设有一条(u,i) -> (u, j)的边,由于没有自环且是…
由于d很小,所以可以把每个点拆成d个点,然后对于边(x,y),连边时连接((x,i),(y,i+1))及((x,d),(y,1)).然后可以对这样连的边跑一遍tarjan缩点.然后直接暴力DP即可.不过当时比赛时不知道为什么一直写挂然后掉分了,后来发现用vector特别占用内存,要改成邻接表写. #include<bits/stdc++.h> using namespace std; ; ],e2[N*]; ],hd2[N*],val[N*],bel[N*],dfn[N*],low[N*],h…