【笔记】SD2021省队第一轮集训Day1
Day1 图论杂题
例1 Jump
在数轴上有 n 个跳跃重心 a_1,a_2,…,a_n。
你每次可以选择一个跳跃重心,跳到当前位置关于它对称的地方去。
q 次询问,每次给出起点 s 和终点 t,询问从起点到终点最少需要跳多少步,无解输出 -1。
数据范围:1≤n≤200,0≤a_i,s,t≤〖10〗4,1≤q≤〖10〗5。
想法一
对每个跳跃中心直接建\(n\)条边然后每次单源最短路。复杂度 \(O(n*maxa*q)\)。
想办法怎么沿用上一次询问。
正解
留坑(1)
\(x -> 2 * a_k - x\)
\(x -> 2 * (a_{p_k} - a_{p_{k - 1} + ...) + (-1) ^ k * x\)
枚举\(k\)的奇偶性
复杂度\(O(n*maxa + q)\)
例2 Today is a rainy day
给定两个数字串 s 和 t,长度均为 n,且仅包含数字 123456。
你每次可以进行下面两种操作:
1.修改串的某一位。
2.选定两个数字 x,y(1≤x,y≤6),把串中所有数字等于 x 都改为 y。
求把 s 改成 t 的最小步数。
数据范围:1≤n≤100。
思路
先搞步骤2再搞步骤一。步骤二一共只有\(6 *6 = 36\)种映射关系。
例3 Walk
给定一张 n 个点的有向图,点 i 的权值是 〖val〗_i,若 〖val〗_i and 〖val〗_j=〖val〗_j,则 i 向 j 连单向边。
另外再给定 m 条有向边,求 1 号点到每个点的最短路。
数据范围:n≤2×〖10〗5,m≤3×〖10〗5,0≤〖val〗_i<2^20。权值都为1。
子集连边
拆虚点表示边?
每个点只想比自己小一的点连边还是减去lowbit
连?
最后跑01BFS
时间复杂度为线性。
例4 树上传送
给定一棵树,i 号点可以花费 v_i 的代价,传送到距离不超过 d_i 的点去。
求 1 号点到每个点的最短路。
数据范围:n≤3×〖10〗^5。
想法1
先缩一波点?联通块内收缩一下?
正解
(NOI2019 )
建点分树后一个点一步跳到的点拆成围绕logn个分治中心的一个固定半径区域的并。批量放进dijkstra
堆里进行更新。(把一个半径内的点一起丢进去)。
前置知识:dijkstra??是我不会的迪杰?!
堆维护pair<分治中心,半径>
表示一个范围内的所有边
例5 Travel
貌似要在反图上BFS。记一下有过少条边不让走,要是都不让走就只能走大的边,不然就走小的边。
例6 Kirakira
对于给定的 n,有函数 f(x)=∑_(i=1)^n▒〖x mod i〗。
对于所有 i≥1,结点 i 连单向边到 f(i)。
求这个无限图中的最长环长。
数据范围:n≤10000。
解法1
我震惊,好美的一个随机算法。
首先\(f(x)\)的权值在\([0,n *(n - 1)/2]\),而且\(f(x)\)关于\(x\)呈正态分布,密集出现的\(f(x)\)出现在\(n * (n - 1) / 4\)附近。要解决这个题得写内向基环树森林,然后随机。
解法2
算一下差值\(f(n) - f(n - 1) = n - anotherthing\)
生成树
Borůvka:每个点选取最近(如果是最小生成树)的点连边,重边只算一次,缩连通块,每次每个连通块大小至少为2,缩连通块后点数至少除以2,最多log_2n次内结束,O(每次复杂度×logn )。
好像邻域。。
例7 新年的繁荣
直接挖坑
例8 病毒实验
直接读不懂题
例9 Expectation
给定一张 n 个点 m 条边的无向连通图,每条边有两个权值 a,b,求以 a 建出来的最小生成树的权值 b 的和的期望(每棵树中均匀随机)。
模 998244353。
数据范围:n≤〖10〗5,m≤2×〖10〗5,相同的 a 的数量不超过 30。
本文来自博客园,作者:咕咕坤,转载请注明原文链接:https://www.cnblogs.com/GuguKun/p/14782890.html