Loading

【题解】UOJ Round #5

// created on 22.09.30

A. 怎样提高智商

首先正确答案最多肯定是所有题都正确了。

\(n=1\) 的时候答案是 \(4\),因为可以任意构造。\(n=2\) 的时候,我们考虑问题 \(1\)A 0 0 0 0,然后问题 \(2\)A 0 0 0 0,这样子问题 \(1\) 不选 A 时,问题 \(2\) 可以选 A, B, C, D 中任意一个,答案是 \(3\times 4=12\)

我们不妨猜测最优答案就是,所有问题都是 A 0 0 0 0,这样答案是 \(3^{n-1}\times 4\)

B. 怎样更有力气

其实就是求最小生成树,我们重新写一下题面。

\(m\) 种边,每种边限定了一个集合 \(S\),满足 \(\forall i,j\in S,i\not=j\)\(i,j\) 有一条边权为 \(w_i\) 的边。同时有 \(p\) 个删边操作,每次删去 \(a_i,b_i\) 之间的第 \(t_i\) 种边。最开始会给出一棵树,所有的集合 \(S\) 都表现为树上的一条链。

按照常规考虑 Boruvka,一共进行 \(\log n\) 轮。每一轮我们考虑将边权从小到大排序,依次考虑。每一次,如果整条路径的点全部属于一个连通块,就跳过。否则,依次检查路径上的每一个还没有找到最小出边的点 \(u\), 暴力 ban 掉其限制边 \(v\),然后在路径上找一个没被 ban 掉的点即可。

分析复杂度:一个点被检查后,要么找到出边,要么没找到出边,但是被考虑的限制数增多。因此事件次数是 \(n+m\) 。接下来我们考虑怎么维护这个东西。

我们记 \(\mathrm{jump}_i\) 表示 \(i\) 往上跳第一个遇到的异连通块点,假设整条链是 \((u,v,t=\mathbf{lca}(u,v))\),如果 \(\mathrm{jump}_u\) 跳到 \(t\) 上面,说明 \(u\rightarrow t\) 都是一样的。于是这样判断整条路径的点属于一个连通块就很简单了。

此时我们再记 \(\mathrm{nxt}_i\) 表示 \(i\) 上第一个没找到最小出边的点。那么每次从 \(u,v\) 往上跳即可遍历到所有的需要检查的点。对于一个需要检查的点 \(s\),我们分别在 \(u\rightarrow t\)\(v\rightarrow t\) 上寻找答案。仅考虑 \(u\rightarrow t\),我们可以通过 \(\mathrm{jump}_i\) 遍历所有同色连通块。如果碰到与 \(s\) 异色的,就暴力检索,否则直接跳过。

暴力检索的次数是 \(n+m\),而跳到同色连通块的个数和跳到异色连通块个数是等数量级的,可以看作也跟 \(m\) 有关。于是总复杂度为 \(O((n+m+p)\log n\alpha (n))\),因为 \(\mathrm{nxt}_i\) 需要并查集。

提交记录:提交记录 #585693 - Universal Online Judge (uoj.ac)

补充说明,关于我好像又对 Boruvka 有误解这件事 .. 每次不是将所有点找到的最小边加入,而是将一个连通块找到的最小边加入,不然正确性有问题。因为我们是对每个点求的最小出边,因此最后还需要以连通块的形式合并。

C. 怎样跑得更快

给定 \(n,c,d,q\),其中 \(n\) 是元个数,\(c,d\) 是方程中的系数,\(q\) 是询问个数。每次给出 \(b_1,\cdots,b_n\) 求解:

\[\sum_{j=1}^{n}\gcd(i,j)^c\mathrm{lcm}(i,j)^dx_j\equiv b_i\pmod{p} \]

数据范围:\(nq\leq 3\times 10^5\)

大致思路应该是将 \(x,b\) 换过来。考虑到:

\[\sum_{s=1}^{n}\sum_{j=1}^{n}[\gcd(i,j)=s]s^{c-d}i^dj^dx_j\equiv b_i\pmod{p} \]

因此我们只需要解决形如 \(\sum\limits_{j=1}^{n}x_j\sum\limits_{s=1}^{n}[\gcd(i,j)=s]s^{c}\equiv b_i\pmod{p}\) 的方程。

考虑令 \(f(s)=s^{c}\),为了拆开 \(\gcd(i,j)\),我们考虑构造 \(f(d)=\sum\limits_{t|d}f'(t)\),这样在每个因子处都算一遍就行。于是,只需要倒着做一遍狄利克雷卷积就行了。

于是现在变成 \(\sum\limits_{s|i}f'(s)\sum\limits_{s|j}x_j\equiv b_i\pmod{p}\),考虑解出 \(x'_s=\sum\limits_{s|j}x_j\) 然后莫比乌斯反演回来。因此我们实际要解决的是 \(\sum\limits_{s|i}f'(s)x'_s\equiv b_i\pmod{p}\),也是倒着做一遍狄利克雷卷积就行了。

提交记录:提交记录 #585741 - Universal Online Judge (uoj.ac)

补充说明:关于无解,应该只在最后一步有问题:当 \(f'(s)\)\(0\),但倒着做狄利克雷卷积后的 \(b'_s\) 不为 \(0\) 时就非法了,需要注意。另外,题目的亮点大概在倒着狄利克雷前缀和弱化条件,这个过程和莫比乌斯反演其实是本质相同的。

posted @ 2022-10-01 16:00  Qiuly  阅读(144)  评论(0编辑  收藏  举报