随笔分类 - 算法-图论
摘要:本文提供了两种解法。一种是硬核数据结构做法。将限制转化为一个几何问题(双矩形的交),用扫描线求解。第二种是巧妙的贪心,证明了如何选择 n1, n2 是最有可能有解的,于是在确定 n1, n2 后,直接进行二分图染色即可
阅读全文
摘要:在图上,题目问了你两个看似无关的问题,然后让你任选其中一个给出解(构造出满足条件的方案)。这是一种特殊的构造问题,在 CF 的比赛中时有出现。如果不掌握相关的技巧,思考起来是非常困难的。本文通过整理了若干道这样的题目,力求帮助读者打开思路,掌握解决这类问题的方法和套路。
阅读全文
摘要:对于某个数 x,某些问题里,需要在 [0, x - 1) 这些点上跑最短路。可以理解为,它是用最短路算法实现了一个 DP。这种做法被称为同余最短路。
阅读全文
摘要:两棵树上公共的边我们都不去动它。将它们缩起来。然后每次找一个叶子节点,拆掉它和父亲的边。发现一定能找到另一条边加上。可以用并查集维护
阅读全文
摘要:记两次查询的节点分别为 a, b,两次查询得到的结果分别为 d1, d2。我们依次枚举 a, d1, b, d2。枚举 a, d1 后,对每个点 v,预处理出罪犯第二天来到点 v 的概率 p(v)。这样就能很方便地对一组 (a, d1, b, d2) 计算答案。发现对同一个 a,在所有 d1 下,p(v)!=0 的点 v 数量是 O(n) 的。所以这四重枚举的时间复杂度,实际是 O(n^3)。
阅读全文
摘要:离散化,设排好序后的序列为 b,对每个位置 i,若 ai != bi,则从 bi 向 ai 连一条有向边。容易发现得到的图,每个连通块都存在欧拉回路,可以用一次操作排好序。此时已经最小化了操作到的位置数。考虑调整策略,最小化操作数量。发现选出若干个连通块后,只需要 2 次操作就能将它们全部排好序(先合并,再操作)。于是在满足限制 s 的前提下,应先合并尽可能多的连通块
阅读全文
摘要:细品题意,可以把问题转化为,在一张DAG上,按编号从小到大依次标记每个节点。在标记节点 i 时,判断是否存在一个【能到达 i 的】或【i 能到达的】节点已被标记。在过程中维护是不好做的。但可以在拓扑排序时递推出,能到达每个节点的最小标号。
阅读全文
摘要:把点分为大点和小点。修改时,如果是小点,则暴力更新所有邻居。查询时,枚举邻居中的大点,计算影响。一共需要O((n+q)*sqrt(n))次修改操作,O(q)次查询操作,考虑怎么维护每个点的集合,来支持这些操作。如果用动态开点线段树维护,则修改是O(log a),查询是O(1)的,不太合适。发现mex的值域只有deg(u),所以可以用数组记录每个值的出现次数,O(1)修改。对值域分块,O(sqrt(n))查询
阅读全文
该文被密码保护。
摘要:比赛链接 CF1340A Nastya and Strange Generator 如题目所定义地,我们设$r_j$表示$\geq j$的位置中,第一个没有被占用的位置。特别地,我们认为位置$n+1$永远不被占用。即:如果$[j,n]$都已经被占用了,那么$r_j=n+1$。 题目还定义了,\(\t
阅读全文
摘要:题目链接 把两个互相关注的人缩成一个集合。如果对于两个集合A,B,集合A中某个人关注了集合B中的某个人,集合B中的某个人也关注了集合A中的某个人(这四个人可以互不相同),则把A,B缩成一个大集合。以此类推。例如下图中,原有A,B两个集合,后来加入了$a\rightarrow c$, $d\right
阅读全文