补题日记

20250621-A-愤怒之火

q12ue2.1s
确实愤怒了。
结论:以一个度数 \(\geq 2\) 的点作为根节点,并把所有非叶子节点放到叶子节点上。如果非叶子节点个数大于叶子节点个数,则无解。

为什么?

考虑度数 \(\geq 2\) 的点 \(S\),删去它一定会形成至少两个连通块。考虑 \(u \in A\)\(v \in B\),那么在新树上,它们应该位于 \(S\) 的同一子树再考虑 \(u \in A\)\(v \in B\)\(u2 \in A\),因为 \(u\)\(v\) 在同一子树,又因为 \(u2\)\(v\) 在同一子树,所以 \(u\)\(u2\) 在同一子树。所以可以证明,\(A,B,C\) 中的所有点,都应该在 \(S\) 的同一子树内,那 \(S\) 就只可能是叶子节点。

20250621-B-勾股计数

\(a^2 + b^2 = c^2\) 变成 \(a^2 = c^2 - b^2\)

所以 \(a^2 = (c-b)(c+b)\)。设 \(A=c-b,B=c+b\)。问题就变成了求 \(a^2\) 的因子 \(d\) 的个数,且 \(d \neq a\)\(d \equiv \frac{a^2}{d} \pmod 2\)\(d < \frac{a^2}{d}\)
容易发现限制 \(1\) 和限制 \(3\) 都是好解决的,最后稍微处理一下就行了,比较麻烦的是限制 \(2\)。尝试对 \(a^2\) 进行质因数分解,得到 \(a^2 = \prod 2^{2sr}p_1^{2r_1}p_2^{2r_2} \dots p_k^{2r_k}\)。因为要两个因子奇偶性相同,所以按是否有 \(2\) 来分讨。

  • 若没有 \(2\)

质因数爱怎么分怎么分,反正都是奇数。每个质因子都可以给 \(d\)\(0 \sim 2r_i\) 个,因此总方案数为 \(\prod (2r_i + 1)\)

  • 若有 \(2\)

无论怎么分都至少有一个偶数。因此要满足条件必须两个都是偶数,即 \(2\) 先预分配两个,剩下 \(2sr-2\) 个随便分,有 \((2sr-1)\) 种方案。因此总方案数为 \((2sr-1)\prod (2r_i+1)\)

发现答案就是这个函数的前缀和。并且这个函数是积性函数。而且质数点值和超级好求。Min_25 筛即可解决。

20250621-C-乱斗之星

20250701-A-置换

打爆了。T1 前前后后浪费了我起码一个半小时。本来是个简单题,但是我忘了自然数幂和怎么 \(O(k)\) 求了。

20250701-B-求和

这个式子一看就非常根号分治。首先,直接暴力复杂度是 \(O(q \times \frac{n}{k})\) 的,\(k\) 较大的时候可以这么做。
\(k\) 较小时做法也不难,设 \(g(x,r)\) 为某个 \((x,r)\) 询问对应的答案,然后将杨辉三角左对齐,发现要求的是第 \(x\) 列的某些点值的和。这个 \(g\) 是可以转移的。删掉杨辉三角第 \(0\) 行和第 \(0\) 列,进行观察。

假设现在已知前面的列的答案和圆圈部分的和,现在要求三角形部分的和。可以把其拆成正方形部分的和,然后发现这些都求过了,于是可以 \(O(1)\) 递推。
但是实际上初值是不知道的,不过根据组合恒等式 \(\sum\limits_{i=x}^n C_i^x = C_{n+1}^{x+1}\),可以把初值设成未知数 \(a\),然后每个值都能用其表示,然后它们和为这个东西,然后解一下方程就做完了。这个组合恒等式可以用杨辉三角推,要记牢。

这部分复杂度是 \(O(nk)\) 的。平衡一下发现 \(k=\sqrt q\) 最优。做完了。

20250701-C-BST

首先得知道怎么 \(O(n \log n)\) 建BST,一个点被插入时,它的父节点只可能是前面被插入的点中它的值域上的前驱与后继,这个前驱记为 \(pre\),后继记为 \(lst\),则如果 \(pre\) 被插入的时间晚于 \(lst\),那么当前点为 \(pre\) 的右儿子,否则它为 \(lst\) 的左儿子。证明略。其实反证挺好证,需要注意到性质要么 \(pre\)\(lst\) 左子树内,要么 \(lst\)\(pre\) 右子树内。

这个题的值域是排列,所以少了很多分讨。

首先呢,可以发现 \(\sum dep = \sum siz\),这是一步简单的转化(根节点深度为 \(1\))。然后呢,发现这个东西和值域有很大关系,将这个数列按值域排序,得到下图:

其中,红三角形代表这个值位于 \([a_1\sim a_{l-1}]\),绿方形代表这个值位于 \([a_l\sim a_r]\),黑圆圈代表这个值位于 \([a_{r+1}\sim a_n]\)。首先考虑黑圆圈,当它们被加入的时候,它们的连边方式不可能跨越绿点或红点(姑且这么称呼吧),因此可以发现,一段连续的黑圆圈可以构成一棵确定的子树,然后其根连在哪可能确定可能不确定。具体而言,如果说一段黑点位于两个红点间,那它的根必定是这两点间后加入那个的儿子。如果位于一个红点一个绿点间,它的根的父节点必定是绿点。如果位于两个绿点间,无法确定。

不过呢,这样就已经可以算出黑点的 \(\sum siz\) 和黑点对红点的贡献了(先不考虑情况二)。当然最开始把红点拎出来建树也能算出红点对红点的贡献。

下一步,将黑点变成一棵棵子树后。

将一段连续的绿点与黑子树拿出来(如图绿色梯形部分),这一段显然也构成一棵子树,并且能知道它挂哪。因此,现在也能算出绿点对红点的贡献(当然黑点对红点的贡献最好在这里一起算)。

现在,只缺绿点的 \(\sum siz\) 了,也就是缺绿点的树形态。将绿点编号离散化,只考虑绿点如何变成一棵树。假设点 \(k\) 是根节点,发现选择它过后,它右边的点不可能选择它左边的点做父节点,它左边的点同理。即它的左右两边又是两棵独立的子树。这启示我们使用区间 DP。设 \(dp_{l,r}\),表示考虑只 \([l,r]\) 这段绿点时绿点的 \(\sum siz\)。转移是简单的,前缀和优化可做到 \(O(n^3)\)。四边形不等式决策单调性优化可做到 \(O(n^2)\)

20250701-D-最小最大

有结论,\(\min\)\(\max\) 确定时,若存在合法树则其形态唯一。把 \([\min,\max]\) 的点设成 \(1\),其余设成 \(0\),那这棵合法树就是包含 \(\min\)\(\max\) 的极大 \(1\) 连通块。证明不难,基于此有 \(O(n^2\log n)\) 的并查集做法。

求的是 \(\sum \min \times \max \times siz\),可以考虑拆贡献。枚举一个点 \(x\),求合法树包含它的所有 \((\min,\max)\) 二元组的 \(\sum \min \times \max\),所有 \(x\)\(\sum\) 求和即是答案。发现合法就是说,\(\min,\max,x\) 三个点的生成子树(啥玩意)上的权值都在 \([\min,\max]\) 之间。画图发现这其实是一个路径上的问题,考虑淀粉质。淀粉纸。点份只。点分治。

然后这个东西它其实是一个双指针+线段树,然后可以做到 \(O(n\log^2 n)\)。(没写完)

继续继续。假设现在有分治中心 \(y\),设 \(mx_i\) 代表节点 \(i\)\(y\) 路径上编号最大的点的编号,\(mn_i\) 代表节点 \(i\)\(y\) 路径上编号最小的点的编号。那么 \((\max,\min,x)\) 合法需要满足如下限制。

  • \(mx_{\max}=\max,mn_{\max} \geq \min\)
  • \(mx_{\min} \leq \max,mn_{\min}=\min\)
  • \(mx_x \leq \max,mn_x \geq \min\)

下文称满足 \(mx_x=x\) 的点为 \(1\) 类点,满足 \(mn_x=x\) 的点为 \(2\) 类点。现在,将 \(2\) 类点作为 \(\min\) 从大到小考虑,则关于 \(1\) 类点和 \(x\) 的限制会逐渐放宽,这个可以双指针处理。设 \(a_i\)\(1\) 类点 \(i\) 有效时值为 \(i\),否则值为 \(0\)\(b_i\) 为有效的且 \(\max\)\(i\) 时能使用的 \(x\) 的个数,则对于一个 \(\min\),所求答案为 \(\min \times \sum a_ib_i\)。双指针已经可以满足 \(mn_{\min}=\min,mx_{\max}=\max,mn_{\max} \geq \min,mn_x \geq \min\) 这些限制了,剩下的限制只需要线段树维护 \(\sum a_ib_i\) 就可以了,这是简单的。然后就做完了。

20250703-A-Count Set

发现在 \(n\) 个点的环上选 \(k\) 个不相邻的点方案数为 \(C_{n-k-1}^{k-1} + C_{n-k}^k\),然后做卷积就可以了。可以用分治 NTT 实现,也可以用神奇的堆合并果子做法。时间复杂度均为 \(O(n \log^2 n)\)。合并果子可能常数小些,没有严谨分析过。

20250703-B-Shattrath City

只要 dp 状态设对了,这个题就很简单了。设 \(f_i\) 表示当前只有 \(i+n-1\) 个点且 \([i,i+n-1]\) 是当前的第一个 \(1 \sim n\) 的排列的方案数。这个东西可以容斥计算,具体来说:

\(f_i = n!\times n^{i-1} - \sum\limits_{j=i-n}^{i-1} f_j(i-j)! - \sum\limits_{j=1}^{i-n-1} f_jn!n^{i-j-n}\)

首先,\(n! \times n^{i-1}\) 是总方案数,后面减去的东西是不合法方案数,就是前面已经出现过 \(1 \sim n\) 的排列的方案数后面那个很好理解。假如这两个排列没有交集,后面的排列当然可以随便填,只要是个排列(有系数 \(n!\)),中间的空位更是可以随便填(有系数 \(n^{i-j-n}\))。如果有交集就是前面减去的这个东西了,画图分析发现,有 \((i-j)\) 项是固定了值但没有固定好位置,其余项既固定了值又固定了位置,所以有系数 \((i-j)!\)

直接分治 NTT 当然可以做到 \(O(n \log^2 n)\),但是使用一些解方程和生成函数技巧(主要是移项),可以做到 \(O(n\log n)\)

20250703-C-Gilneas

疑似有点诈骗了。这个期望可以这样统计:对于每个操作,算出它能修改的并且能保留到最后的期望边数,再乘上操作权值,求和。

不能保留只可能是被后面的操作修改了,所以从后往前枚举操作。一条边不被修改的概率,就是能影响到它的操作的 \(\prod(1-p_i)\)。然后发现一个操作要修改的是这么一些边:

这个好像不是很做得了?不过发现把权值挂在边上本身就是一个很呃呃的事情,简单分讨发现完全可以把权值挂在每条边的父节点上,因为可以发现每个点的连向子树的边的权值必然相等。所以树剖就可以 \(O(n\log^2 n)\) 做了,查询要处理一下,要从给定节点的父节点查询。

Bonus:如果操作都是在普通的链上,怎么做?发现修改操作只多了一条不能被父节点表示的边,是否能特殊处理?我不会,会的人私信我。

20250703-D-Connectivity of Erdős-Rényi Graph

呃呃。

省选联考 2025 D1T2-追忆

重新整理一下现在要做什么。\(n\) 个点 \(m\) 条边的 DAG(\(n\leq 10^5,m\leq 2\times 10^5\)),排列 \(a\),排列 \(b\)\(q\) 次操作。操作 \(1\) 是交换 \(a_x\)\(a_y\),操作 \(2\) 是交换 \(b_x\)\(b_y\),操作 \(3\) 是询问满足 \(l \leq a_y \leq r\)\(x\) 能到达的 \(y\)\(b_y\) 的最大值。

首先,DAG 的可达性是必须得知道的。因此,使用 bitset\(O(\frac{nm}{\omega})\) 的时间复杂度内求出 \(To_x\) 表示 \(x\) 能到达的点是简单的。现在来考虑 \(l \leq a_y \leq r\) 的限制,倘若已经预处理出 \(Ba_i\),表示 \(\{y|a_y\in[i,n]\}\),那么显然 \(Ba_l \oplus Ba_{r+1}\) 就是满足条件的点集。但是呢这样修改操作复杂度就直接爆了,为 \(O(n)\)

没有什么其它太好的思路,考虑值域分块,设块长为 \(B\),那么 \(Ba_i\) 表示 \(\{y|a_y \in [(i-1)B+1,iB]\}\),预处理应该可以做到 \(O(\frac{n}{B}(\frac{n}{\omega}+B))\)\(O(\frac{n^2}{B\omega}+n)\)。每次查点集时整块直接异或,复杂度 \(O(\frac{n}{\omega})\),散块暴力,复杂度 \(O(B)\)

将得到的点集 & 上 \(To_x\) 就是同时满足两个限制的点集,设为 \(U\)。那么如何查找 \(\max b_y\) 呢?好像也不太好找,考虑二分答案。倘若已经预处理出 \(Bb_i\),表示 \(\{y|b_y \in [i,n]\}\),那么显然,若 \(U\) & \(Bb_{Mid}\) 不为空,就说明合法点集中至少有一个点 \(b\)\(\geq Mid\)。但是呢这样修改操作复杂度就直接爆了。所以考虑值域分块,设块长为 \(C\),同 \(Ba\) 类似处理,先二分出最大的有合法 \(b\) 值的那个块,再在块里暴力找,时间复杂度 \(O(\frac{n}{\omega}\log \frac{n}{C}+C)\)

修改操作直接对每个块暴力修改就行了,时间复杂度 \(O(\frac{n}{B})\)\(O(\frac{n}{C})\)

最优块长暂未分析。代码暂未实现。

UPD:已过。块长取的 \(B=500\)\(C=1000\),很可能不是最优块长。

也许是举一反三?-Range Reachability Query

20230830-20250705-cycle

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!值得铭记。

20230830-20250705-poker

呃呃,呃。

20230830-20250705-meat

四元环计数。

20230830-20250705-seq

神秘分块。

[伯明翰20250708]灯佳和郊奂

ぼみんはん。

乱搞な了 \(70pts\),相同しる的 geven 拿了 \(100pts\),因为他会写 fread,下去我也要背。

正解很智慧。先枚举一个 \(a\) 的前缀 \(A_i\),并找到 \(b\) 的满足 \(\leq A_i\) 的最长前缀 \(B_j\)。那么若 \(A_i-B_j=0\),显然可以直接输出这两个前缀。否则,容易证明它们的差在 \([1,n-1]\) 之间,又因为这样的前缀有 \(n\) 组,根据げちゃお原理,必定有至少两组前缀差值相等,然后画图就能发现它们之间是一种合法方案。具体地,若 \(A_{i1}-B_{j1}=A_{i2}-B_{j2}\),なめ显然,\(A_{i2}-A_{i1}=B_{j2}-B_{j1}\)。然后就能输出了。

值得一提的是,如果一个数列的和太小,那么两组前缀的差可能 \(\geq n\),但容易发现,这样交换两个数列再做一遍就是对的了。

[伯明翰20250708]圣诞派派翁

しだんぱいぱいうん。

首先,将问题转化为一个聪明的网络流模型。见图。

\(b\) 就是数列,\(k\) 是做减法的操作的参数。容易发现答案就是其最大流。但是这个东西不好求,考虑求它的最小割。枚举割掉了几条 \(k\) 边,容易知道 \(k\) 边一定是割前 \(i\) 小的,那么有式子 \(ans=\min_{i=0}^m pre_i + \sum\limits_{j=1}^N \min(b_j,m-i)\)。要对每个添加操作后的数列求。根据简单观察,随着数的添加,决策点 \(i\) 一定是单调不减的,同时,若决策点是 \(i\),当前进行了前 \(j\) 次添加操作,那么可以 \(O(1)\) 地做 \(w(i,j)\) 的指针移动(就像莫队一样),因此,用整体二分复杂度可以做到 \(O(n\log n)\)

[伯明翰20250708]我真的极了

值域倍增分块建线段树,均摊下来复杂度是对的。

具体见 https://www.luogu.com.cn/problem/P7447。

[模拟赛20230824] - 20250710 - 猫捉老鼠

终于做出来一道 T1 了,蕾姆れむ,,,

[模拟赛20230824] - 20250710 - 格斗大赛

呃。智慧题。

[模拟赛20230824] - 20250710 -大脑过载

李超树。如果要维护二次函数,那么检查一下式子能不能通过换元等方法化简之类的。

[模拟赛20230824] - 20250710 - 龙了个龙

你们记得那道题吗?就是统计有几个区间所有元素都恰好出现了 \(0\)\(3\) 次的那道题?
这个题就是那道题的削弱版,使用异或哈希+莫队即可。
https://codeforces.com/contest/1418/problem/G。

写的有点水。

1 堆

题意:内部题目。滑动窗口删最大,奇加偶减,求 \(sum\)

如果像题目说的那样先删后加,没有什么性质,但如果先加后删,就可以发现 \(\max\) 单调不增,指针维护就可以了。

2 矩阵

题意:内部题目。NOIP 2017。自己查。

将原矩阵分成 \(n\) 个长为 \(m-1\) 的行和 \(1\) 个长为 \(n\) 的列。每个序列需要维护的操作是删掉第 \(k\) 个数和在末尾加一个数。可以使用线段树软删除,维护 \(01\) 序列并线段树二分。这样就能知道每次软删除掉的数的下标了,然后暴力模拟就行了。

3 市场

不平凡的操作只有除法操作一个。可以这样处理:
定义线段树节点 \(p\) 所管辖区间值的极差为 \(M_p\)
定义势能函数为 \(\sum\limits_p \log(M_p)\)
那么,假设现在对 \([l,r]\) 这个线段树节点 \(p\) 管辖的区间做除法操作。
\(M_p=0\),直接区间改。
若除法操作后,\(M'_p = 0\),直接区间改。
\(M_p = 1\),且除法操作后,\(M'_p=1\),直接区间加。
否则两边递归再 PushUp
容易发现,大多数情况下节点 \(p\) 极差至少除以二,则其势能函数至少减 \(1\),少数情况下极差不能除以二,这个时候我们进行了 \(O(1)\) 处理。

而原始序列带来的势能是 \(O(n\log V)\),每次区间加会将 \(O(\log n)\) 个节点的势能重置成 \(O(\log V)\),则时间复杂度为 \(O(n \log V+q\log n\log V)\)

4 老题重做

容易发现将点 \(i\) 右上角的点单独拿出并按横坐标排序后,满足条件的点 \(j\) 的个数即为这些点的纵坐标前缀最小值的个数。扫描线+楼房重建线段树维护即可。

5 小明的树

这个题质量比较高。
因为要求美丽时刻的点亮点的连通块数量之和,先考虑什么时候一棵树是美丽的。
首先可以发现,若一棵树美丽,当且仅当所有未点亮的点的父节点也未点亮。但是这个没啥用。
进一步地,若一棵树美丽,当且仅当未点亮的点形成一个连通块。
找一些性质。树上随便选一些点,它们一定构成一个森林。并且,其连通块数量等于其点的数量减去边的数量。
那么,时刻 \(i\),未点亮点的个数是 \(n-i\),若两端均为未点亮点的边的数量是 \(n-i-1\),则这个时刻树是美丽的。

怎么维护?这相当于维护一个序列,下标 \(i\) 的初值为 \(n-i\)。设 \(time_u\)\(u\) 被点亮的时刻,那么边 \((u,v)\) 两端均未点亮的时间段为 \([1,\min(time_u,time_v)-1]\),因此这条边就应该给序列的 \([1,\min(time_u,time_v)-1]\) 这个区间减一。最后序列上值为 \(1\) 的下标对应的就是美丽时刻。线段树显然可以维护,边修改操作也很容易。

现在要求美丽时刻时点亮点的连通块数量之和,也是类似的,不细说了。就类似于有一个序列 \(a_i\),且 \(a_i \in \{0,1\}\),然后有一个序列 \(b_i\),求 \(\sum\limits_{i=1}^n a_ib_i\)。线段树能做。

6 区间切割

这个题也太妙了!首先

A Appleman and Tree

苹果男人和树。

B [HAOI2015] 树上染色

树形背包。

C Colorful Tree

待补。

D Ribbons on Tree

首先,一个大小为 \(2n\) 的连通块乱连接彩带,方案数是 \((2n-1)!!\)
然后,这个题显然需要容斥。设 \(dp_{u,j}\) 表示 \(u\) 子树内有至少 \(j\) 条边未被覆盖的总方案数,可以简单类树形背包转移。这个至少是二项式反演的至少,设 \(f(i)=dp_{1,i}\)\(g(i)\) 是恰好 \(j\) 条边未被覆盖的方案数,那么有 \(f(n)=\sum\limits_{i=n}^N C_i^n g(i)\),得 \(g(n)=\sum\limits_{i=n}^N (-1)^{i-n}C_i^n f(i)\)。答案是 \(g(0)\),所以 \(ans=\sum\limits_{i=0}^N (-1)^i f(i)\)。如果想在转移后乘上容斥系数,刚刚所说的类树形背包复杂度就是 \(O(N^3)\),因为要记录边数。但发现此题容斥系数异常简单,所以转移断边的时候乘上 \(-1\) 就行了,不再记录边数,复杂度 \(O(N^2)\)

E Donation

发现结论:每个点如果要捐赠,必定在到达其的最后一次进行捐赠。
证明:不考虑初始钱数 \(< \sum\limits B_i\) 的情况,则每次到达一个点都必定能捐赠。那么,若同时经过一个点两次,在后一次捐赠一定更优,因为中间去别的点的时候钱数变多了,自己又不受影响。

这个应该是容易发现的。那么限制转化为,在点 \(u\) 的每个时刻,当前钱数都必须 \(\geq \max(A_u-B_u,0)\)。这里设 \(C_u = \max(A_u-B_u,0)\)

很难发现,可以倒着来做。即,第一次走到点 \(u\) 时,需满足当前钱数 \(x \geq C_u\),然后可以获得 \(B_u\) 的钱,并走到其它点,最后要求所有点都被访问过。模拟一下发现很有道理。这样也解决了一大难题:正着做的时候很难贪心,但是这样的话按 \(C_u\) 从小到大走显然是对的,因为得到的代价是正的,可以满足更多限制。

遗憾的是,有时会强制经过一些大的 \(C_u\)。但是发现一个事情,现在想维护的是与当前终点连通的权值小于等于某个数的点,这个显然能用 Kruskal 重构树做,放到转化后的问题上也很正确:每次解锁一个新的点,它的子树肯定就都能走了。

但如果每次枚举一个终点再去做,复杂度至少是 \(O(n^2)\) 的。然后可以用 DP,直接设 \(dp_u\) 表示从某个节点出发,走完 \(u\) 子树所有点的最小初值。设根节点为 \(rt\),则 \(ans=dp_{rt}+\sum\limits B_i\)。这个也是说得通的,在原问题上,\(\sum\limits B_i\) 是一定要花的,所以实际上是在使最后剩余钱数最少。倒着做时这里的最小初值当然就是最小剩余钱数了。

那这个 DP 怎么做呢?设 \(Bsum_u\)\(u\) 子树里 \(B\) 的和,那么叶子节点时 \(dp_u=C_u\),否则枚举 \(u\) 的儿子 \(v\),从 \(v\) 走上来需要的最小初值是 \(\max(f_v,C_u-BSum_v)\),后面的是能到达点 \(u\) 所需的最小初值。到达点 \(u\) 后就可以去其它子树了,所以 \(dp_u = \min\{\max(f_v,C_u-BSum_v)\}\)。这个 DP 其实相当简单,但是我不小心忘了重构树的性质,就又看了题解。

F Fedor Runs for President

没看题解。口胡一下。

考虑环上的点变成若干子树,那么增加的简单路径就是位于不同子树的点对数量。这个不好刻画,考虑让位于相同子树点对数量最小,那么画图可以发现,新边连接两个叶子一定是最优的。

完了不会了,看题解吧。

我生气了。

上述结论都没错,考虑怎么让子树 \(siz\) 平方和最小。加边操作可以刻画成,选择一条树上路径,删掉路径上的边,使形成的若干棵新树的 \(siz\) 平方和最小。

考虑 \(dp\)。设 \(dp_u\) 表示路径从 \(u\) 延伸到一个叶子时 \(siz\) 的最小平方和。那么 \(dp_u = \min\{dp_v+(siz_u-siz_v)^2\}\)。这是单链,直接暴力枚举根可以做到 \(O(n^2)\)。如果枚举两条单链合成一个双链,设双链的答案为 \(g_u\),就有式子 \(g_u = \min\{dp_{v1}+dp_{v2}+(siz_u-siz_{v1}-siz_{v2})^2\}\)。拆式子得到 \(dp_{v1}+dp_{v2}+{siz_u}^2 + {siz_{v1}}^2 + {siz_{v2}}^2 - 2siz_{v1}siz_u - 2siz_{v2}siz_u + 2siz_{v1}siz_{v2}\)。枚举 \(u\)\(v1\) 过后,这是一个形如 \(y=kx+b\) 的形式,现在要求最小值,使用李超线段树维护。如果 \(v1\) 取到了 \(v1\) 的直线怎么办呢?i_love_xqh 说可以单点查了这个点再把它的直线加进去。于是这样就是 \(O(n\log n)\) 的了。

G Labeling the Tree with Distances

这是啥啊。

显然要用集合哈希!!!但是不能用 Xor 哈希了,这个维护 \(depth\) 的换根 Xor 哈希不好做。。。考虑另一种哈希方式,\(Hash_T=\sum\limits_{i=1}^n cnt_i base^i\),其中 \(cnt_i\) 代表有根树 \(T\) 中深度为 \(i\) 的点的个数。然后换根就很简单了。然后剩余部分都很简单了。

J 树上 K 级祖先

学习长链剖分。

首先,和重链剖分类似的,找到每个点的长儿子,然后形成若干条长链。具体的,设 \(g_u\)\(u\) 子树内深度最深的那个点的深度,那么 \(u\) 的长儿子就是 \(u\) 的子节点中 \(g\) 最大的。

预处理出 \(f_{u,i}\) 表示 \(f\)\(2^i\) 级祖先,时间复杂度 \(O(n\log n)\)

对于每条长链,设其长度为 \(len\),预处理出其链顶向上的 \(len\) 个点和其链顶沿链向下的 \(len\) 个点的编号,时间复杂度 \(O(n)\)

现在假设要查 \(u\)\(k\) 级祖先,设 \(k\)\(\text{highbit}\)\(2^h\),那么先跳到 \(u\)\(2^h\) 级祖先 \(u'\)。此时 \(u'\) 必定有一个 \(2^h\) 级儿子 \(u\),因此它所在这条长链的长度必定 \(\geq 2^h\)。现在设 \(k'=k-2^h\)。直接从 \(u'\) 跳到长链顶,若发现跳多了,就说明 \(u\)\(k\) 级祖先就在这条长链上,算一算向下找即可。否则 \(k'\) 必定小于 \(u'\) 所在长链长度,跳到链顶后需要的增量就更少了,因此算一算过后发现我们一定预处理过,直接向上找就可以了。如果将 \(\text{highbit}\) 也预处理,那么查询时间复杂度是 \(O(1)\) 的。

A Nezzar and Hidden Permutations

怎么刻画一个二元限制?典型的,考虑在 \(l_i\)\(r_i\) 间连边。如果说想要 \(p_{l_i} < p_{r_i}\),那么定向为 \(l_i\) 指向 \(r_i\),反之亦然。因此这个东西相当于给图定向。那么显然,合法的 \(p,q\) 都是定向出来这个图的拓扑序。(这里指的拓扑序不是传统意义上的拓扑序,而是每个点在拓扑排序中被遍历到的顺序。就是说 \(p_u\)\(u\) 在拓扑排序中被遍历到的顺序。)也就是说,要找到两个拓扑序,使得它们的相同点值尽量少。

考虑现在有一张 \(n\) 个点的无向图。如果说现在有一个点度数为 \(n-1\),那么对于任意一种定向方式,它在 \(p,q\) 中的值一定相等。然后现在把这个点删去。如果存在度数为 \(n-2\) 的点,那么它也是必定相等的,证明均显然。由此可见,相同点值个数的下界,就是删到只剩 \(n'\) 个点且满足没有度数为 \(n'-1\) 的点时的 \(n-n'\)。可以构造出这样一种方案吗?可以的可以的。

我们现在的目的是让删后的图没有相同点值。设最后删到 \(G'\),那么其中所有的点度数必然 \(< n'-1\)。这个东西不好刻画,也不好构造方案。但如果考虑它的补图,就有如下几个性质:

  • 没有孤立点。显然。
  • 删边后若能构造方案,则删边前必然也能构造方案。这里需要说明。补图的删边相当于原图的加边,也就代表着更多的限制,如果在更多限制下能构造方案,更少限制下当然这个方案也合法。
  • 如果它是点数 \(\geq 2\) 的菊花图,那么很好构造。设根编号为 \(x\),则 \(p_x=1,q_x=n'\)。其它节点在 \(p\) 中依次赋值 \(2 \sim n'\),在 \(q\) 中依次赋值 \(1 \sim n'-1\)。需要注意,在补图中,需要满足的限制其实是没有的边的限制,因此可以证明这个构造是对的。

大概可以猜到做法了。用若干菊花图覆盖完补图,且要求点数 \(\geq 2\)。然后不同菊花图之间点对的限制是好满足的,相同的就按上面构造,然后就做完了。

怎么分成若干菊花图是简单的。先写完题有时间再补。

posted @ 2025-04-28 22:00  Just_int_mian  阅读(129)  评论(13)    收藏  举报