2022-01-19 Contest: HN 省队集训 2018 Day2

  具体考试资料是从 yyb 博客上发现的,于是成为了考题。

考试总结

  • T2 居然没有分段打表,下次一定要想到!
  • T1 的平衡想到没有继续下去,感觉平衡复杂度的题目白做了(捂脸

赛后题解

A : HN 省队集训 2018 Day2 T1 walk

白兔有一颗 \(n\) 个点以 \(1\) 为根的树。树上每个结点有一个权值 \(val\)
如果两个点 \(a, b\) 满足 \(a\)\(b\) 的祖先且 \(val_b | val_a\)(整除),则白兔可以直接从 \(a\) 跳到 \(b\)
现在白云想知道,对于每一个点 \(k\),白兔从 \(1\) 号点跳若干步到达 \(k\) 号点的方案数是多少?
两个方案不同为它们经过的点数不同或者某一步到达了不同的点。
\(n \le 10^5, val \le 10^{18}\),保证 \(1\) 号点可以直接跳到所有节点。


数据结构 分块

考场想到了分块以平衡复杂度,但是感觉之后过于复杂,同时 \(10^{18}\) 的因数分解直接把我整吐了(根本不想写 Pollard_rho),然后直接摆烂了。

今天写了写 Pollard_rho,感觉这一次思路清晰了不少,以前只是单纯背下来的部分就豁然开朗了。

  DP 是显然的,关键就是找到快速转移的方式。

  首先,我们可以将 \(val_1\) 用 Pollard_rho 分解质因数,然后每个节点的值可以表示为质因数分解之后的向量,\(x\) 能跳到 \(y\) 当且仅当 \(x\) 对应的向量每一位都 \(\ge\) \(y\) 对应的向量每一位,如果暴力查找,因为 \(d(10^{18})\)\(10^5\) 的级别,那么就是 \(10^{10}\) 了,显然不可接受。

  注意到我们每次可以 \(\mathcal O (1)\) 修改 \(\mathcal O(n)\) 查询,也可以 \(\mathcal O(n)\) 修改,\(O(1)\) 查询,于是我们可以考虑枚举最佳的质因数划分,将其分成两个子集,前面的单点修改,暴力查询,后面的暴力修改,单点查询,然后复杂度就是 \(\mathcal O(n\sqrt{d(10^{18}}) = \mathcal O(10^5)\)

  总的代码(带暴力)写了 4.4 KB,但是整体感觉还是比较好写好调的,对拍天下第一!

代码

B : HN 省队集训 2018 Day2 T2 game

白兔在玩游戏。
在一个 \(n \times n\) 的棋盘中放入 \(n\) 个车,使得任意两个车不能互相可达(即不在同一行或同一列)。
白云要从 \((1, 1)\) 出发,每一步可以往上下左右走一格,最终到达 \((𝑛, 𝑛)\)。同时,它不能超出棋盘的边界,且不能走到有车的格子。
问白兔有多少种放车的方法使得白云能够达成目标。
\(n \le 10^9\),多组询问。


数学 打表

  sb tea,开场直接秒了 \(80\) 分,签到题居然在 T2?

  考虑如果不能到达,一定是有一条斜线的车把路给堵住了,然后我们可以考虑这条斜线的位置,在固定枚举顺序容斥一下,可以直接得到式子:

\[\sum_{i = 1}^{n - 1} \left((n - i)! - \sum_{j = 1}^{n - i} (n - i - j)! \right) + \sum_{i = 0}^{n - 1} i! \]

  前面的式子表示矩形的左上角部分的斜线被完全堵住了,但是右下角斜线没有封住;后面的表示右下角有一条斜线被封住的答案。

  然后预处理前缀和可以做到 \(\mathcal O(n)\)

  于是又不会了,想到后面的可能是一个比较神奇的优化,于是自闭了。

  但是 \(10^9\) 一看就比较离奇,可以分段打表优化。(怎么这都忘记搞了)

  代码不想放了。

C

  回文自动机题,爬了,有时间学了再填坑。

posted @ 2022-01-19 21:42  Werner_Yin  阅读(72)  评论(0编辑  收藏  举报