【笔记】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_2⁡n次内结束,O(每次复杂度×log⁡n )。

好像邻域。。

例7 新年的繁荣

直接挖坑

例8 病毒实验

直接读不懂题

例9 Expectation

给定一张 n 个点 m 条边的无向连通图,每条边有两个权值 a,b,求以 a 建出来的最小生成树的权值 b 的和的期望(每棵树中均匀随机)。

模 998244353。

数据范围:n≤〖10〗5,m≤2×〖10〗5,相同的 a 的数量不超过 30。

posted @ 2021-05-18 21:48  咕咕坤  阅读(108)  评论(0编辑  收藏  举报