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?
考虑如果不能到达,一定是有一条斜线的车把路给堵住了,然后我们可以考虑这条斜线的位置,在固定枚举顺序容斥一下,可以直接得到式子:
前面的式子表示矩形的左上角部分的斜线被完全堵住了,但是右下角斜线没有封住;后面的表示右下角有一条斜线被封住的答案。
然后预处理前缀和可以做到 \(\mathcal O(n)\)。
于是又不会了,想到后面的可能是一个比较神奇的优化,于是自闭了。
但是 \(10^9\) 一看就比较离奇,可以分段打表优化。(怎么这都忘记搞了)
代码不想放了。
C
回文自动机题,爬了,有时间学了再填坑。