日记
洛谷剪切板死了,本人也懒得搬了,有要的可以直接要。
为了分别 OI 与日常,这里只会放些我认为比较好的题,其他题应当在学习笔记中。
to do list
- 多项式杂烩 (doing)
- LCT ?
- 仙人掌(2024.9.18)
- 一些较难的 DP
- 构造 与 ad-hoc
- 博弈论(不会打表找规律) : (
- 推式子练习
- 计算几何 ?
- PAM,
广义SAM- Kummer 定理
Prufer 序列- 模拟费用流
算法枚举
- DP,贪心,二分
- 核心:找规律,观察性质
- 套 DS : 扫描线,线段树,BIT,平衡树?堆,单调栈/队列
技巧枚举
- 正难则反,根号分治,前后考虑,拆贡献,转化,时间倒流
2025.1.7
在平面直角坐标系求大小确定的矩阵所可能包含的最多点数,可以扫描线。
在有 \(\mathrm{mex}\) 的题目中,可以考虑暴力枚举 \(\mathrm{mex}\),AT_arc156_b Mex on Blackboard。
谨防诈骗题,构造题,AT_arc156_c Tree and LCS。
咋找的题都是我的弱项啊,容斥好弱啊,这么简单的都没咋想出来...,AT_abc200_e Patisserie ABC 2。
看到一个 Kummer 定理的东西,加入 to do list。
极其好的题,有很大的启发性。
异或有一个相消的性质,即若对于长度为 \(k\) 的序列 \((p_1,p_2,\cdots,p_k)\),考虑其翻转序列 \((p_k,p_{k-1},\cdots,p_1)\),其 \(\sum a_{p_i}\) 是相等的,可以相消,除非其与其翻转序列相等,即为 回文序列,所以我们只需要考虑求回文序列 \(P\) 的异或和。
- 若长度 \(x\) 为 偶数,则可以直接拆成两部分后,两部分的 \(\sum a_{p_i}\) 是相等的,则有 \(f_x = 2f_{\frac x 2}\)。
- 若长度 \(x\) 为 奇数,则我们需要考虑加上中间一位的贡献,然后转化为偶数的情况,一个想法是直接把需要整体加的数记下来。
则可以设 \(f_{i,j}\) 表示对于所有长度为 \(i\) 的序列 \(P\) 中,\(j + \sum a_{p_i}\) 的异或和。
- 对于偶数 \(i = 2x\),有 \(f_{2x,j} = 2f_{x,\lfloor\frac{j}{2}\rfloor} + (nj \bmod 2)\)。
- 对于奇数 \(i = 2x+1\),我们需要枚举中间项,有 \(f_{2x+1,j} = \displaystyle\bigoplus_{i=1}^n 2f_{x,\lfloor\frac{j + a_i}{2}\rfloor} + (n(j + a_i) \bmod 2)\)
如果你不是很理解的话,你需要知道 异或 对于 \(2\) 的次幂的乘法是具有分配的,即 \(2^k(x \bigoplus y) = (2^kx) \bigoplus (2^ky)\)
首先第一维是只有 \(\log k\) 的,第二维大小最大是 \(\max a_i\) 的,转移 \(\mathcal{O}(n)\)。
总复杂度 \(\mathcal{O}(n\max a_i \log k)\)。
该题启示我们对于要求的特殊性,及时排除不需要讨论的答案。
2025.1.8
额额额,先做了点 CPU,[民间数据练习场] THUSC 2023 Day2 奋斗四小时,手搓 CPU。
你说的对,但是我的构造就是使。
无解是好判断的:\(2k > n\),因为中间的点没有可行位置。
首先我们贪心的选,让每个点移动越近越好,考虑每 \(2k\) 个数分为一组,则可以正好每个数移动 \(k\) 次,即 \((1,\cdots,2k-1,2k) \Rightarrow (k+1,\cdots,2k,1,\cdots,k)\),但是显然不能分完,考虑最后 \(2k\) 个数怎么分。
最后 \(k\) 个数是好分的,一定在 \(i - k\) 的位置上,因为其可行位置本来只有 \([n - 2k + 1,i - k]\),然后把剩下的数从小到大填进去,合法是显然的,且由于从小到大填,字典序也有保障。
遇到式子中带绝对值且要求最大值时,可以直接拆掉绝对值。
2025.1.9
在遇到边权只有 \(0/1\) 的图中,可以考虑去除掉无用边,CF2057E2 Another Exercise on Graphs (hard version)。
看了点容斥的课,以及简单复习了下拉插,奇妙反演。
首先恰好 \(k\) 位同学被碾压不好求,考虑反演,设 \(f(i)\) 表示钦定 \(i\) 位同学被碾压的方案数,\(g(i)\) 表示恰好 \(i\) 位同学被碾压的方案数,有。
然后考虑 \(f(k)\) 怎么求,每个课程是独立的,可以先只考虑一个,最后将所有课程的方案数乘一起即可。
设当前课程最高分为 \(U\),\(B\) 神排名为 \(R\),则除了我们钦定的 \(k\) 个人分数比 \(B\) 神小,还存在 \(n - 1 - (R - 1) - k\) 个人分数比 \(B\) 神小,有 \(\dbinom{n - 1 - k}{n - k - R}\) 种方案,然后我们可以枚举 \(B\) 神此课程的分数,即 \(\displaystyle\sum_{i=1}^Ui^{n - R}(U - i)^{R - 1}\),这样枚举是基于值域的,考虑怎么优化,先推下式子。
左边可以直接枚举,右边是一些自然数次幂和的形式,可以直接拉插。
前半部分复杂度是 \(\mathcal{O}(n^2)\) 的,后半部分仅与每门课程相关,复杂度 \(\mathcal{O}(n^3\log{n})\)。
总复杂度 \(\mathcal{O}(n^3\log{n})\),但是这个傻子懒,拉插写的 \(\mathcal{O}(n^2)\),总 \(\mathcal{O}(n^4)\),也能过。
自己犯的几个错误:二项式定理没拆 \(-1\)(上述框住的),打代码拉插的 \(y\) 没乘(难绷)。
2025.1.10
在容斥中的一些子集可以用同一个 DP 状态表示,即可考虑用 DP 来求容斥的贡献。
首先考虑考虑暴力容斥,枚举边的子集,将这些边钦定为无颜色边,则树被分为几个连通块,对于一个大小为 \(x\) 的连通块,若 \(2\mid x\),则其贡献为 \((x - 1)!!\),否则为 \(0\)。
即 \(ans = \displaystyle\sum (-1)^{|T|}\displaystyle\prod_{i=1}^{|T|}(T_i - 1)!!\)
指数显然是不行的,注意到容斥求贡献时只与联通块的大小相关,所以可以考虑 DP,设 \(f_{x,j}\) 表示在以 \(x\) 为根的子树中,当前 \(x\) 所在连通块大小为 \(j\) 时的容斥贡献。
则在枚举子树 \(y\) 时,若当前边钦定为无颜色边,则有 \(f_{x,j} \gets f_{x,j} \times f_{y,k} \times (-1) \times (k - 1)!!,2 \mid k\),\((-1)\) 是多的容斥系数,否则是树包。
感觉和 NOIP2024 T3 非常像,唉...。
复杂度 \(\mathcal{O}(n^2)\)。
首先可以状压,设 \(f_{i,j,now}\) 表示 \(i\) 所对应的节点为 \(j\) 且当前子树内已选子集为 \(now\) 的方案数,枚举子集是 \(\mathcal{O}(n^33^n)\) 的。
貌似可以优化,我不会。我们可以考虑来降低一些限制,然后通过容斥求解。
我们要求的是每个节点唯一被对应的方案数,所以我们需要有 \(now\) 的状态,考虑去掉该限制,可以 \(\mathcal{O}(n^3)\) 求解,然后我们枚举子集,钦定未被对应的节点,容斥下,即 \(ans = (-1)^{|T|}f(\overline{T})\)。
复杂度 \(\mathcal{O}(n^32^n)\)。
III P7481 梦现时刻
考虑直接求出 \(F\),不会卷积,只能硬推。
考虑右式。
考虑框中式子。
综上得到:
复杂度 \(\mathcal{O}(n^2)\)。
多重集的组合数,就是裸的容斥。
满足的第 \(i\) 个限制是 \(s_i \leq f_i\),\(ans = \left|\displaystyle\bigcap_{i=1}^n S_i\right| = (-1)^{|T|}\left|\displaystyle\bigcup_{i=1}^{|T|}\overline{S_{T_i}}\right|\)。
考虑第 \(i\) 个限制的补集为 \(s_i \geq f_i + 1\),我们可以用总数减去,这样是等价的,转化为了 \(s - \displaystyle\sum_{i=1}^{|T|}f_{T_i} + 1\) 个花中分成 \(n\) 堆,插板法可得答案为 \(\dbinom{s - \displaystyle\sum_{i=1}^{|T|}(f_{T_i} + 1) - 1 + n}{n - 1}\)。
复杂度 \(\mathcal{O}(2^nn)\)。
注意组合数会爆 longlong,要先取模再乘。
2025.1.11
考虑二项式反演转化为钦定问题,设 \(f(i)\) 表示钦定与 \(i\) 字符串匹配的方案数,枚举子集,可以 \(\mathcal{O}(2^nn|S|)\) 简单求。
反演得 \(g(k) = \displaystyle\sum_{i=k}^n(-1)^{i-k}\dbinom{i}{k}f(i)\)。
总复杂度 \(\mathcal{O}(2^nn|S|)\)。
2025.1.16
today : 思维题选讲
感觉 md 除了细节还是细节,这就是我们思维题吗,
代码难度可太低了。
我们对该序列做个前缀和,考虑操作变成了什么,第一类操作相当于将一些子序列都加了 \(1\),第二类类似。
则我们归结为了可以选择一个子序列加/减 \(1\),只需找到 \(> 0\) 中最大的,以及 \(< 0\) 中最小的即可。
复杂度 \(\mathcal{O}(n)\)。
大意:交互,你可以询问区间 \([l,r]\) 中次大值的位置,让你求出最大值的所在位置,询问次数 \(\leq \lceil1.5\log{n}\rceil\),询问区间总长度 \(\leq 3n\)。
首先有一个比较基础的想法,对于一个区间 \([l,r]\) 我们找出了其次大值的位置 \(p\),我们进行二分,若 \(p \in [l,mid]\),则我们询问 \([l,mid]\),若询问答案为 \(p\),则代表最大值就在 \([l,mid]\) 中,否则我们需要重新考虑(额外多询问一次) \([mid+1,r]\) 区间中的次大值,这样二分,可以达到询问次数 \(2\log{n}\),考虑进一步优化。
当查询答案为 \(p\) 时我们询问的次数比另一种情况少,考虑平衡这个东西,即进行三分四分114514分,对于 \(t\) 分,我们将 \(p\) 所在位置定为较大的分区间,则询问次数为
假设 \(f(n) = k\log{n}\),则有 \(k\log{t} + 1 = k\log{(1 - t)} + 2 = 0\),解得 \(t = \dfrac{\sqrt{5} - 1} 2,k = -\dfrac{1}{\log{\frac{\sqrt{5} - 1}{2}}} \approx 1.44\)。
所以我们只需要 \(0.618\) 分就可以了!
III CF1477C Nezzar and Nice Beatmap
一个结论:对于一个点,我们找离他最远的点当下一个即可,因为三角形中最长边的两边角一定为锐角。
复杂度 \(\mathcal{O}(n^2)\)。
IV CF2053D Refined Product Optimality
显然两数组排完序对应最大,修改有一万种 \(\log\)。
\(A\) 中最大的 \(m\) 与 \(B\) 对应,因为大小相等的可以等价操作。
然后先进行不必要的操作,在进行对应,可以用 \(set\) 维护,细节蛮多的。
复杂度 \(\mathcal{O}(n\log{n})\)。
给出从 \(n\) 个节点开始的 \(dfs\) 序,还原树。
对于每个节点 \(dfs\) 序最大的一个点,一定为原树的叶子,这样我们考虑找到叶子,叶子中 \(dfs\) 序最小的点即为其父亲,每次操作完删去这些叶子。
这样可以做到均摊 \(\mathcal{O}(n^2)\)。
给出的相等关系比较弱,考虑假定原树中存在 \((x,y)\) 这条边,则我们可以推出整个图,这样是 \(\mathcal{O}(n^5)\) 的。
考虑到枚举所有边是没有必要的,因为经过 \(1\) 的一定存在一条合法边,则我们只需要枚举 \((1,x)\) 即可。
复杂度 \(\mathcal{O}(n^4)\)。
VIII QOJ # 9586. 野兽节拍
考虑到对于每个长度为 \(3\) 的字符串,其合法位置是均摊 \(\mathcal{O}(n)\) 的,则我们每次删掉 \(3\) 个点,可以用链表维护。
总复杂度 \(\mathcal{O}(n)\)。
锐评:纯纯的大漠你。对了,记得字典序 : (
IX CF1442D Sum
直接暴力 DP 是 \(\mathcal{O}(nk^2)\)。
考虑到一个结论:在所选的数组中,最多只有一个数组没被选完。
证明:设数组 \(a,b\) 正好选到 \(i,j\),有 \(a_i < a_{i + 1},b_j < b_{j + 1}\)。
不妨设 \(a_i < b_j\),则不选 \(a_i\) 改选 \(b_{j+1}\) 更优,即最后只会剩下一个数组没有选满。
则我们可以考虑哪个数组没有选满,剩下的是背包。
可以分治做,具体的,在考虑 \([l,r]\) 区间内,我们加入 \([l,mid]\) 中的物品,递归到 \([mid+1,r]\) 中,还原后加入 \([mid+1,r]\) 中的物品,递归到 \([l,mid]\) 中。
这样当递归到 \([l,l]\) 时即为除了 \(l\) 这个物品,其他物品的背包数组。
复杂度 \(\mathcal{O}(nk\log{n})\)。
2025.1.17
公平组合游戏,考虑求其 \(SG\) 值。
直接求显然不行,考虑特殊点单独求,复杂度 \(\mathcal{O}(m\log{n})\)。
普通点即为一些斜率为 \(1\) 的直线。
2025.1.19
today: 高级数据结构
因为太难写了,导致笔记延期了。。。
大意:给定 \(n\) 个 \(m\) 维向量,初始都为 \(0\),有 \(q\) 个修改 \([l,r,p,x]\) 表示将 \([l,r]\) 中的向量第 \(p\) 维设为 \(x\),不会在同一位置操作多次,求出 \(n\) 个向量的字典序排名,相等编号小的靠前。
考虑用主席树维护 \(n\) 个向量,每个修改可以拆成 \([l,p,x]\) 与 \([r+1,p,-x]\),只有单点修改。
然后我们可以正常排序,用主席树哈希找出两个向量的 \(\mathrm{lcp}\),用来比较字典序大小。
复杂度 \(\mathcal{O}(n\log^2{n})\)。
本题有 1log 做法,我不会,好像是利用主席树的结构进行基数排序。
\(\max\) 没有可减性,不好维护。
考虑扫描 \(x\) 这一维,用线段树维护 \(y\),对于一段询问 \([l1,r1]\) 相当于求出 \([l1,r1]\) 中线段树上 \([l2,r2]\) 的历史最大值。
然后可以直接考虑线段树分治,但是直接将询问拆成 \(\log{n}\) 个复杂度会爆。
考虑在一个最大的分界 \(mid\),分别向左右考虑,这样的分治结构叫做猫树分治,或者二区间合并。
具体来说,在区间 \([l,r]\) 中首先我们已经加入了 \([1,l-1]\) 的修改(不考虑历史最大值)。
先考虑询问的右部分 \([mid+1,r]\) 的答案,先加入 \([l,mid]\) 的修改,然后依次考虑 \([mid+1,r]\) 的历史最大值,递归到右半部分,然后需要撤销 \([mid+1,r]\) 的修改,再进行考虑 \([l,mid]\) 的部分,依次撤销 \([l,mid]\) 的修改(倒序),求出历史最大值,最后递归到左半部分。
线段树需要 历史最大值 以及 还原 的操作,前半部分这里不说,对于还原,我们考虑在额外维护一个 \(tag\),当为 \(1\) 时将 \(tag\) 下传,并还原历史最大值。
总共分了 \(\log{n}\) 层,修改总共是 \(\mathcal{O}(n\log{n})\) 的,查询单个是 \(\log{n}\) 的。
总复杂度 \(\mathcal{O}(n\log^2{n} + q\log{n})\)。
李炒熟不可删,不能直接扫描线。
考虑链上怎么做,可以考虑分治,消去不可删的影响,或者说可以直接叫线段树分治,直接分治也可以,不过利用线段树的结构更好写。
分治后可以直接上李超树,复杂度 \(\mathcal{O}(n\log^3{n})\)。
可以更优,考虑李超树插入 2log 的原因是因为插入的是一条线段,可以进而对 \(x\) 进行分治,消去线段的影响,可以当成直线,这样就可以不用李焯书了,维护一个凸包,可以简单做到线性,复杂度 \(\mathcal{O}(n\log{n}\log{X})\)。
考虑上树,比较 native 的想法是直接暴力树剖,套个树套树,呃,太劣了,考虑树剖的一个性质,一条 \(u \to v\) 的路径一定是一些重链前缀加上一段任意区间,考虑将每个线段加到重链顶,在加上上述链的做法。
总复杂度 \(\mathcal{O}(n\log{n}(\log{n} + \log{X}))\)。
这个傻呗 2log 没调出来,代码复杂度是 \(\mathcal{O}(n\log^3{n} + n\log^2{n})\),也过了。
考虑主席树维护每个时间下每条铁路栈顶的进入时间。
用另一颗线段树维护答案,操作 \(1\) 是好办的,操作 \(2\) 可以在主席树上查询当前铁路的进入时间 \(t\),则 \(t-1\) 就是下一个栈顶所在时间,可以直接查询位置,进行修改,操作 \(3\) 相当于在主席树上区间覆盖,这里有一个 Trick:可以直接 ls[p] = rs[p] = p。
总复杂度 \(\mathcal{O}(n\log{n})\)。
2025.1.20
哦哦哦,今天 WC,很遗憾不能去 : (
今天模拟赛。
I B. T2
暴力背包是 \(\mathcal{O}(n^3)\) 的,离线反向加物品是 \(\mathcal{O}(n^2)\) 的。
有个性质:最多只会选 \(\sqrt{K}\) 个元素,\(1 + 2 + \cdots + \sqrt{K} \approx \dfrac K 2\)。
这里其实是 \(\sqrt{K\log{K}}\) 个,不过差距不大,
因为 \(x_i \times v_i \leq K\),考虑根号分治 \(B\),对于 \(x_i \leq \sqrt{K}\) 的,跑背包,对于 \(x_i > \sqrt{K}\) 的可以考虑另一种 DP,设 \(g_i\) 表示选到价值为 \(i\) 的东西所需的最小物品容量,此时加入一个物品复杂度是 \(\mathcal{O}(\frac K B)\) 的,这里有个小优化,我们倒序枚举,可以将枚举上限定为 \(\dfrac K {x_i}\),常熟更小。
这样对于询问我们可以枚举 \(x_i > B\) 的价值,是 \(\mathcal{O}(\frac K B)\) 的,然后加上 \(x_i \leq B\) 的答案即可。
总复杂度 \(\mathcal{O}(BK + \frac K B(\sqrt{K\log{K}} + m))\),取 \(B = \sqrt{\sqrt{K\log{K}} + m}\),得最优复杂度为 \(\mathcal{O}(K\sqrt{\sqrt{K\log{K}} + m}) \approx \mathcal{O}(K^{\frac 5 4}\log^{\frac 1 4}{K})\)。
刚开始没算平衡点,直接取了 \(B = \sqrt{K}\) TLE 了 12pts,代码中直接令 \(B = 300\)。
答案即为 \(n!\displaystyle\prod_{p\in \mathbb{P},p\leq m}\dfrac{p - 1}{p}\)。
需要注意的是若 \(n \geq m \geq mod\),则会 \(n!\) 中的 \(mod\) 会与 \(\prod p\) 的 \(mod\) 消掉,影响答案。
2025.1.21
练习赛有两个不会的知识点出现在同一道题。
Hall 定理与高维前缀和。
首先可以二分答案,可以发现答案最大是 \(2kn\) 的,然后可以转化为二分图模型,跑最大流判断是否能跑满,但复杂度显然不对。
- Hall 定理:一个二分图有完备匹配,当且仅当二分图中任意一个大小为 \(k\) 的点集,向另一部分连边,这样所能够连到的点集大小都 \(\geq k\)。
不会证。
这个只在需要求完备匹配是可以用到,本题就是。
对于每一天,先预处理向其连边的点集,则考虑对于一个点集其所能到达的天数即与其有交的天数,容斥下变成其补集的子集天数,可以用高维前缀和得到 \(\mathcal{O}(n2^n)\) 的复杂度。
总复杂度 \(\mathcal{O}(2^nn\log{kn})\)。
首先若 \(\sum a_i < 2n-2\),一定无解。
考虑其 Prufer 序列,树上一个度数为 \(d_i\) 的点在 \(n-2\) 的 Prufer 序列中恰好出现了 \(d_i - 1\) 次,即答案为
相当与是一些卷积,考虑生成函数,设 \(f_i(x)\) 为第 \(i\) 项的生成函数,则
乘一起答案即为
最后即为 \((n - 2)!\prod_{i=1}^na_i\dbinom{\sum a_i - n}{n - 2}\)。
复杂度 \(\mathcal{O}(n)\)。
学习高维前缀和。
对于一个状态 \(now\) 我们考虑求出其子集的最大值与次大值,最后再对答案求个前缀最大值。
其中可以子集前缀 \(\max\),总复杂度 \(\mathcal{O}(n2^n)\)。
\(a_i | (a_j \And a_k) = (\overline{a_i} \And a_j \And a_k) + a_i\),其中 \(\overline{a_i}\) 表示补集。
则我们可以枚举 \(a_i\),考虑贪心找 \(a_j \And a_k\),可以高维后缀和维护,还有条件是下标必须大于 \(i\),我们需要维护最大与次大的下标。
复杂度 \(\mathcal{O}(n2^n)\)。
2025.1.22
简单数据结构。
至今不知有何用。
说下分裂,当将 \(p\) 树中 \([l,r]\) 分裂开,若当前区间完全包含于分裂区间,则断开原树边,接到新树上,否则新建节点递归,注意分裂完都要 pushup。
学 splay,依旧觉得没屁用。
2025.1.23
高级数据结构。
I LOJ #6376. 「HNOI2016」序列 数据加强版 加强版
原题曾经作者用历史和写过,不过复杂度比较劣是 \(\mathcal{O}((n + q)\log{n})\) 的,这里有更好的方法。
对于一个询问 \([l,r]\),我们找出其最小值 \(a_p,p\in[l,r]\),我们分别考虑 \([l,p-1]\) 与 \([p+1,r]\) 的答案,求取方法是一致的,这里阐述前者。
设 \([l,r]\) 区间的答案为 \(s[l,r]\),则我们考虑容斥 \(s[l,p-1] = suf_l - suf_n - \text{something}\),其中 \(suf_i\) 表示 \(s[i,n]\),可以用单调栈简单求出。
\(\text{something}\) 表示的是左端点在 \([l,p-1]\) 右端点在 \([p,n]\) 的答案,由于我们知道 \(a_p\) 为 \([l,r]\) 的最小值,所以对于每个左端点其答案都是相同的,即 \(\displaystyle\min_{i=l1}^{r1}a_i = \displaystyle\min_{i=p}^{r1}a_i,l1\in[l,p-1],l2\in[p,n]\),所以答案为 \((p - l) \times (s[p,n] - s[p+1,n])\)。
算好两区间答案后,再加上跨越的答案,即 \(a_p \times (p - l + 1) \times (r - p + 1)\)。
可以发现单调栈预处理后,询问是 \(\mathcal{O}(1)\) 的,瓶颈在寻找最小值,可以用 期望 \(\mathcal{O}(1)\) RMQ 或 四毛子 解决。
总复杂度 \(\mathcal{O}(n + q)\),空间复杂度 \(\mathcal{O}(n)\)。
从子树考虑,对于异或我们一般都会用 01 Trie 处理,考虑假设我们得到了 \(x\) 子节点答案的 01 Trie,则我们需要对 Trie 进行整体 \(+1\) 操作,考虑由低位到高位建立 Trie 树,则对于整体加一,相当于交换某个 \(x\) 节点的左右儿子,然后向下递归,本质就是进位,则我们可以直接维护,然后 Trie 树合并即可。
总复杂度 \(\mathcal{O}(n\log{V})\)。
神题。
这种断边加边的东西很容易想歪,考虑一颗树是美丽的需要满足什么条件,可以转化为未点灯的节点形成单独的一个联通块。
然后利用点减边,只有一个联通块等效于 \(n - i - f_{off} = 1\),\(i\) 为当前操作次数,\(f_{off}\) 表示两端都未点灯的边数,这样每条边就独立了。
要计算贡献,相当于是联通块数量,同样可以点减边,答案即为 \(i - f_{on}\),\(f_{on}\) 表示两端都点灯的边数,所以我们可以用线段树维护这两个信息,对于一条边的贡献则是线段树上的区间加减,至此最终的答案即为 \(\sum[a = 1]b\),其实还是不好做,但是我们发现 \(a\) 始终 \(\geq 1\),则我们只需维护最小值,判断是否为 \(1\) 即可。
总复杂度 \(\mathcal{O}(n\log{n})\)。
Trick:树上:点数 - 边数 = 1。扩展是平面图的欧拉公式:点 - 边 + 面 = 2。
2025.1.24
简单学点图论,复习了下板子。
等着咕笔记。
有源汇上下界最大流。
模拟吗费用流。
2025.1.25
流流小 Trick:先考虑较劣情况,然后开流。
网络流建模的模型。
模型 \(1\):最大权闭合子图。
给定一个图,有一些依赖关系,每个点有自己的收益,求最大收益。
将 \(S\) 向正收益节点连边权为收益的边,将负收益节点向 \(T\) 连边权为其绝对值的边,相当于最小割模型
模型 \(2\):区间 \(k\) 覆盖问题。
费用流。
将节点从左向右排开,可以直接向右走 \((0,0)\) 边,遇到区间也可以 \((1,a_i)\) 走。
模型 \(3\):混合图欧拉路径问题。
先判连通性。随意设定边的方向,统计点的度数(入 - 出)。
- 若点 \(u\) 度数应该上升 \(2x\),连边 \((u,t,x)\)。
- 若点 \(u\) 度数应该下降 \(2x\),连边 \((s,u,x)\)。
- 若边 \((u,v)\) 能反边,则连边 \((v,y,1)\)。
满流即为可行解。
切切糕糕,据说是古早模型 P3227 [HNOI2013] 切糕。
期望是假的,可以简单求出 \(g_{i,j}\) 表示第 \(i\) 位选手写第 \(j\) 道题的期望奖励。
然后考虑建立最小割模型,将每一位选手形成长度为 \(m\) 的链,切掉第 \(i\) 条边代表做第 \(i\) 套题。
考虑限制,即可将 \(y\) 的第 \(i\) 条边上的点向 \(x\) 第 \(i + k\) 条边的点连 \(inf\),即可规定割掉改变后 \(i\) 上只能割 \(i + k\) 往后的边,不然仍然联通。
注意精度问题,将 \(inf\) 开到 \(1e9\)。
总复杂度 \(\mathcal{O}(dinic)\)。
没错就是 A + B。
考虑暴力建图,建立最小割模型,与 \(s\) 相连的为白点,与 \(t\) 相连的为黑点。
考虑限制,枚举 \(j < i\),若满足条件,则连边 \((j,i,p_i)\),因为只要有满足的就能减少 \(p_i\),但是这样会重,建个虚点即可,这样边数是 \(\mathcal{O}(n^2)\) 的。
考虑优化,形如区间,套上主席树优化建图即可,复杂度 \(\mathcal{O}(dinic)\)。
直接求最大好像不是很好求,考虑个简单容斥,对于一个不合法的三元组,总存在一个点的出度为 \(2\)。
令 \(d_i\) 为 \(i\) 节点的出度,则答案即为 \(\dbinom{n}{3} - \displaystyle\sum \dbinom{d_i}{2} = \dfrac{n(n - 1)(n - 2)}{6} + \dfrac{\displaystyle\sum d_i - \displaystyle\sum d_i^2}{2} = \dfrac{n(n - 1)(n - 2)}{6} + \dfrac{\frac{n(n - 1)}{2} - \displaystyle\sum d_i^2}{2}\)
我们要的即为 \(\displaystyle\sum d_i^2\) 的最小值,考虑费用流模型。
首先源点向每场比赛连 \((1,0)\) 的边,对于一场比赛,根据所给已知边向选手连 \((1,0)\) 边,对于一个选手的费用为流量的平方,费用不是简单的一次函数不好刻画,一个方法是连一些容量为 \(1\),费用为 \(1,3,5,7,\cdots\) 的边,比较巧妙,原理是 \((x + 1)^2 - x^2 = 2x + 1\)。
复杂度 \(\mathcal{O}(dinic)\)。
黑白染色,源点连黑点,白点连汇点,每个点拆成四个点,可以发现每次旋转本质上只有一个点在动,可以连边,费用流建图即可。
2025.1.27
I P11619 [PumpkinOI Round 1] 种南瓜
很板的东西。
首先考虑没有删除,我们可以每次加入一个区间判断是否与当前区间有交且不包含。
对于两个区间 \([l1,r1],[l2,r2]\),考虑其满足有交但不包含时的条件,首先分类讨论。
- 若 \(l1 < l2\),则只有满足 \(r1 \in [l2,r2)\) 时有交但不包含。
- 若 \(r1 > r2\),则只有满足 \(l1 \in (l2,r2]\) 时有交但不包含。
可以画图理解。
则对于新加的区间 \([l2,r2]\),对于第一种情况,我们只需判断所有右端点在 \([l2,r2)\) 的区间的 \(l\) 端点是否小于 \(l2\),可以用线段树维护最小值。
类似的对于第二种情况,可以用线段树维护所有左端点为 \(l\) 的最大右端点。
然后考虑删除,可以直接线段树分治,具体的将每个区间的存在时间 \([l,r]\) 拆分成 \(\log{n}\) 个线段树上的区间,最后我们 dfs 一遍,每当进入 \(p\) 节点,将节点上的所有修改加入,这样我们到达叶子节点即可得到每个时间的答案,最后当我们退出节点时,要撤销我们所修改的东西。
总复杂度 \(\mathcal{O}(n\log^2{n})\)。
2025.1.29
树上拓扑序计数:树上每个节点 \(x\) 都有 \(fa_x\) 在 \(x\) 之前的排列数量。有 DP \(f_x = \dfrac{(siz_x-1)!\prod_{v\in son(x)}f_v}{\prod_{v\in son(x)}siz_v!}\)
也可写成 \(\dfrac{n!}{\prod_{i=1}^n siz_i}\)。
I P11618 [PumpkinOI Round 1] 造树据
非常好的题啊。
2025.1.31
树同构。
一种方法是直接记录子树,复杂度平方。
int dfs(int x,int fa){
vi a = {-1};
for(int y : e[x])
if(y != fa)a.pb(dfs(y,x));
sort(a.begin(),a.end());
if(mp.find(a) == mp.end())mp[a] = ++cnt;
return mp[a];
}
另一种是 Hash,一个不好卡的方法是 xor shift。
ull xsf(ull x){
x ^= x << 13;
x ^= x >> 7;
return x ^ (x << 17);
}
SP7826 TREEISO - Tree Isomorphism
2025.2.4
积性函数的迪利克雷卷卷积,可以用高维卷积解释,对于每一维相当于在其某一质因数 \(p\) 的正常卷积。
以前的 基础数论 I:同余,重新整了点。
莫比乌斯反演的核心是推式子 + 整除分块。
Miller-rabin 素数探测法:核心只有两步:
- 费马小定理验证。
- 二次探测法。
杜教筛可以求出很多东西,如 \(\mu \ast \mu \ast \mu\),卷上一些东西,即可求,杜教筛嵌套的复杂度依旧是正确的。
不知道怎么自己想出来随机化。
因为我们所选的子集 \(\geq \lceil\frac n 2\rceil\),所以对于任意元素都有 \(\dfrac 1 2\) 的概率在答案数组内,我们可以随机化,假设某个数 \(x\) 在答案数组内,则我们考虑其因数在所有数中出现的次数,找出满足条件的最大因数即可,正确概率 \(1 - \dfrac 1 {2^k}\)。
考虑到可能的 gcd 非常少,只有 \(\log n\) 种,即 \(a_1,a_1 + 1,a_1 - 1,a_n,a_n + 1,a_n - 1\) 六个数的质因子,可以枚举这些 gcd。
设 gcd 为 \(d\),然后对于每个数,求出其需要满足条件的费用,若 \(d\nmid a_i \land d\nmid (a_i + 1) \land d\nmid (a_i - 1)\),则该位置一定要被删除,找出最左端与最右端,然后前缀后缀求个最小值即可。
注意若没有上述位置,需要特殊求。
复杂度 \(\mathcal{O}(n\log{V})\)。
非常好的原根题。
首先考虑第 \(i\) 个集合,可以发现是形如 \(a_i^x\) 的一堆东西,其中指数是 \(b\) 的一些组合模上 \(p - 1\),利用裴蜀定理得知 \(x\) 是 \(\gcd(\displaystyle\gcd_{i=1}^m b_i,p-1)\) 的倍数,令其等于 \(r\),则第 \(i\) 个集合即为 \(\{a_i^{rk},k \in \mathbb{Z}\}\)。
我们考虑求出 \(a^r\) 的阶 \(c\),有 \((a^r)^c \equiv 1\pmod p\),则有第 \(i\) 个集合大小即为 \(c_i\),\(\{(a^r)^0,(a^r)^1,\cdots,(a^r)^{c-1}\}\)。
由阶的性质可知其模 \(p\) 意义下互不相同,且为 \((a^r)^c \equiv 1\pmod p\) 方程的 \(c\) 个不同的根。
我们找出 \(p\) 的任意原根 \(g\),我们构造集合 \(\{g^{0\times \frac {p - 1} c},g^{1\times \frac {p - 1} c},\cdots,g^{(c - 1)\times \frac {p - 1} c}\}\),可知其模 \(p\) 意义下互不相同,且为 \(x^c \equiv 1\pmod p\) 的 \(c\) 个根,所以这两个集合意义相同。
然后我们令 \(s = \dfrac {(p - 1)} c\),则问题转化为给定 \(n\) 个 \(s\),求出 \(x \in [1,p - 1]\) 中存在多少个数满足 \(\exist s_i,s_i | x\)。
我们可以枚举 \(p - 1\) 的因数进行容斥,因为不是 \(p - 1\) 因数的答案为 \(0\),设 \(f(d)\) 表示 \(d\) 的倍数中只被 \(d\) 标记,不被 \(d\) 的其他倍数标记的个数。
则若 \(\exist s_i,s_i | d\) 则 \(f(d) = \dfrac{p - 1}{d} - \displaystyle\sum_{dk\mid (p - 1)}f(dk)\),否则为 \(0\)。
总复杂度 \(\mathcal{O}(d(p)(n\log V + d(p)))\)。
2025.2.5
数论,困难的。
经典结论 \(d(i,j) = \displaystyle\sum_{x\mid i}\sum_{y\mid j}[\gcd(x,y) = 1]\)
给定 \(n \le 10^5,m \le 10^9\),求 \(\displaystyle\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\) 模 \(10^9+7\) 的取值。
\(n,m\) 不对称,不妨考虑枚举 \(n\),求出 \(\displaystyle\sum_{j=1}^m\varphi(nj)\) 的值,设其为 \(F(n,m)\)。
由于欧拉函数,可知对于 \(n\) 存在质因子的次数大于 \(1\),则可以提出来,即找出最大的因子 \(d\) 满足 \(\mu(d) \not= 0\),则有 \(F(n,m) = \dfrac n dF(d,m)\),这样简化了问题。
对于其他情况,我们设 \(d = \gcd(n,j)\),则有 \(\varphi(nj) = d\varphi(\frac {nj} d) = d\varphi(\frac n d)\varphi(j)\),带入到式子里。
最后需要考虑的即为右边框中式子。
因为 \(n\) 的特殊性,所以有 \(\varphi\left(\frac n d\right) = \varphi\left(\frac n T\right)\varphi\left(\frac T d\right)\)。提出 \(\varphi\left(\frac n T\right)\) 后,剩下的可以直接就是 \(\mathcal{O}(n\ln n)\)。
还有一种方法是 \(\displaystyle\sum_{d\mid T}d\varphi\left(\frac n d\right)\mu\left(\frac T d\right) = \varphi\left(\frac n T\right)\),但是不会证。
最后记忆化即可?复杂度说是 \(\mathcal{O}(n\ln n + m^{\frac 2 3})\),不会证。
直接解 \(x\) 不是比较好解,考虑若已知 \(x\) 如何快速得到 \(b\)。
为了简便计算,我们将 \(i^d\) 与 \(j^d\) 并到 \(x,b\) 中,再将 \(c\) 减去 \(d\)。
设 \(y_i = \displaystyle\sum_{j=1}^{\lfloor\frac n i\rfloor}x_{ij}\),\(f(n) = \displaystyle\sum_{d\mid n}d^c\mu\left(\frac n d\right)\)。
则有 \(b \equiv (f \cdot y) \ast \mathrm{I}\),则 \(y = \dfrac {b \ast \mu}{f}\),最后通过 \(y\) 还原 \(x\) 即可。
都是狄利克雷卷积,复杂度 \(\mathcal{O}(nq\ln n)\)。
假设分数 \(\dfrac x y\) 是长度为 \(l\) 的纯循环分数,则 \(\dfrac {xk^l} y\) 与 \(\dfrac x y\) 的小数部分是相同的。
即 \(\frac x y - \lfloor \frac x y \rfloor = \frac {xk^l} y - \lfloor \frac {xk^l} y \rfloor \Leftrightarrow x - \lfloor \frac x y \rfloor y = xk^l - \lfloor \frac {xk^l} y \rfloor y\)
则 \(x \equiv xk^l \pmod y\),因为要的是最简分数,有 \(\gcd(x,y) = 1\),则 \(k^l \equiv 1 \pmod y\)。
\(\exists l \in \mathbb{N^{+}}, k^l \equiv 1 \pmod y \Leftrightarrow\gcd(k,y) = 1\) 互为充要条件。
证明:必要性是显然的,这里证充分性。
令 \(b = k^{l - 1}\),则需要 \(\exists l \in \mathbb{N^{+}}, kb \equiv 1 \pmod y\),即 \(kb + \omega y = 1\)。
根据裴蜀定理,其有解当且仅当 \(\gcd(k,y) = 1\)。\(\square\)
然后就可以开始推式子了。
记忆化即可,当 \(k = 1\) 时:
杜教筛 + 整除分块即可。
对于状态数:
- 若 \(d = 1\) 则会递归到 \(S(n,m,1)\),状态数 \(\mathcal{O}(1)\),复杂度 \(\mathcal{O}(\sqrt{n})\)。
- 否则 \(n,m\) 其中一个至少减半,则最多只有 \(\log n\log m\) 的状态,转移是 \(\mathcal{O}(\sqrt{k})\)。
总复杂度 \(\mathcal{O}(\log n\log m\left(\sqrt{n} + \sqrt{k}\right) + n^{\frac 2 3})\)。
2025.2.6
线性代数,不是很会。
简单讲了点线代相关,定义之类的。
矩阵可以转移,用矩阵快速幂,一个技巧是 矩阵乘向量 是 \(\mathcal{O}(n^2)\) 的,当有多组询问时,可以预处理 \(A^{2^c}\) 的矩阵,这样可以减掉一个 n。
然后是高斯消元,可以暴力解方程,也可以找出矩阵的秩。
行列式与矩阵求逆都可以用高斯消元。
线性基,蛮简单的东西,本质就是维护线性空间的基。
困难的题目。
先不考虑美食节,设 \(f_{i,j}\) 表示第 \(i\) 天在 \(j\) 城市的最大愉悦值,转移是简单的 \(f_{i,v} = \max(f_{i - t,u} + c_i),(u,v) \in \mathbb{E}\)。
第一维状态只有 \(nw_i\) 个,用 \((min,+)\) 矩阵维护快速幂即可。
加上 \(k\),总复杂度 \(\mathcal{O}\left(k(wn)^3\log T\right)\),爆了。
我们利用上面说的技巧,维护转移矩阵的 \(2\) 的次幂次方,达到 \(\mathcal{O}\left((wn)^3\log T + k(wn)^2\log T\right)\),看起来还是有点炸,但是能过。
II AT_yahoo_procon2019_qual_e Odd Subrectangles
存在 \(\mathcal{O}(n^2)\) 做法。
我们考虑已经选了某些行,那么答案是什么,可以发现答案即为将这些行的对应值异或后 \(2^{cnt_0}2^{cnt_1 - 1}\) 的值。
即若异或和存在 \(1\) 则答案为 \(2^{m - 1}\),否则为 \(0\)。
所以我们对于 \(n\) 行放进线性基内,则需要的即为线性基内异或不为 \(0\) 的方案数,做个容斥,找异或和为 \(0\) 的方案数,即为 \(2^{n - rk_{S}}\),其中 \(rk_{S}\) 代表 \(S\) 这个线性空间的秩。
最后答案即为 \(2^{n + m - 1} - 2^{n - rk_{S} + m - 1}\)。
总复杂度 \(\mathcal{O}(n^2)\)。
III U531853 TopCoder SRM494 Div1 KnightsOut
考虑每个点设个未知数,最后得到的即为一些异或方程组,暴力高斯消元是 \(\mathcal{O\left((nm)^3\right)}\)。
考虑到每个点的限制位置非常特殊,将 前两行 + 第一列 设为主元,我们从上到下从左到右,枚举其他的点 \((x,y)\),为了让 \((x - 2,y - 1)\) 是白点,则 \((x,y)\) 是固定的,则剩余不一定满足条件的只有 最后两行 + 最后一列。
所以高斯消元,复杂度为 \(\mathcal{O}\left(\dfrac {(n + m)^3} {\omega}\right)\)。
因为异或的性质,可以发现任意一个非简单路径可以表示为一条 \(1\to n\) 的简单路径以异或上一些简单环。
所以我们找个生成树,加入线性基求最大值即可。
复杂度 \(\mathcal{O}(n\log V)\)。
2025.2.7
LGV,不可战胜的。
矩阵树定理,一个图的生成树为 \(L = D - E\) 的任意一个 \(n - 1\) 阶行列式的值,\(D\) 为度数,\(E\) 为邻接矩阵,证明等我咕。
交互,拼尽全力无法战胜。
DP 是容易的,但是 DP 是类似环状的,不能直接求,暴力的可以直接高斯消元 \(\mathcal{O}(m^3)\),显然不行。
观察一下增广矩阵:
发现变换时只会影响 \(\mathcal{O}(1)\) 行,且每一行只有 \(\mathcal{O}(1)\) 个可用元素。
所以可以做到 \(\mathcal{O}(m)\)。
总复杂度 \(\mathcal{O}(nm)\)。
II P10778 BZOJ3569 DZY Loves Chinese II
题目就是要判断给定边集,判断是否存在一个子集为该图的割,一个结论是一个图的割空间是环空间的正交补。
并且如果你做过 这题,你就知道,一个简单环的异或值可以由生成树的一些环异或得到。
所以我们可以通过异或哈希使得任意一个环的异或值都为 \(0\),这样只要对于给定边集的权值线性相关,则该图不联通。
不会证明哦~。
总复杂度 \(\mathcal{O}(n + qk\log V)\)。
限定条件是每个边集内恰好一个,可以转化为至少一个的交集,容斥,求子集内钦定不选该边集,剩下的随便选的方案数。
然后问题就转化为了给定一些边,求生成树个数,矩阵树定理。
总复杂度 \(\mathcal{O}(2^{n-1}n^3)\),常数很小。
求的即是起点确定,终点不定的不相交路径。
LGV 引理,转化为不需要不相交,每个排列贡献为 \((-1)^{\mathrm{sgn}(\sigma)}\)。
这样就可以状压 DP,设 \(f_{S,i}\) 表示已经处理 \(S\) 中的终点位置,且其位置都 \(\leq i\) 的方案数,则有转移。
- 若当前位置不为某个机器人的终点,则 \(f_{S,i} \gets f_{S,i - 1}\)。
- 否则枚举某个机器人,有 \(f_{S,i} \gets \dbinom{m}{i - x_j}(-1)^{t}f_{S\setminus \{j\},i - 1}\),其中 \(t\) 为加入 \(j\) 后增加的逆序对数。
总复杂度 \(\mathcal{O}(2^nkn)\)。
存在更优的做法。
恶心题。
我们可以考虑无向边,变为两条边,则图中存在欧拉回路,所以我们 dfs,在访问过程中记录一颗树,将树边定为该节点的最后出边,则我们枚举每个出边,若提前走了最后出边,则记录下来,返回去,这样只会多 \(2(n - 1)\) 步,总 \(2m + 2n - 2\) 步。
2025.2.8
简单字符串,字符串基础
体现了回文串的一些性质。
首先双回文串也是回文串,所以对于以 \(i\) 节点为中心的回文串(这里通过加字符变成奇回文串),回文半径为 \(r_i\),需要找的即为 \(j \in [i+1,i+r_i],r_i \geq j - i\) 的最大值。
转换一下,即 \(j - r_i \leq i\) 的最大 \(j\),可以用线段树二分。
我们观察 manacher 的过程,当 \(c + r[c] \geq i\) 时,这些回文串都是出现过的,说明只有当回文右端点增加时才会增加本质不同回文串数。
得出结论:一个字符串的本质不同回文串只有 \(\mathcal{O}(n)\) 个。
这样我们对于每个回文串判断其是否为双回文串即可,复杂度 \(\mathcal{O}(n)\)。
本人唐,莫名多了个 hash。
II P9576 「TAOI-2」Ciallo~(∠・ω< )⌒★
Ciallo~(∠・ω< )⌒★
首先肯定要分讨,\(t\) 这个串是否要分割,不分割是平凡的,hash 判断 \((i,i + m - 1)\),方案数即为 \(\dbinom{i - 1}{2}\dbinom{n - i - m + 1}{2}\)。
然后考虑 \((i,j)\) 为分割后的左右端点,则需要满足 \(j - i + 1 > m\),且一个前缀加上一个后缀可以拼成 \(t\),即我们需要 \(\mathrm{lcp}(s[i,n],t)\) 与 \(\mathrm{lcs}(s[1,i],t)\),设两个答案分别为 \(z_i\) 与 \(u_j\),可以用 \(\mathrm{Z}\) 函数做到 \(\mathcal{O}(n)\),因为 \(i,j\) 两点必须存在,所以应该与 \(m - 1\) 取 \(\min\)。
然后能拼成 \(t\) 当且仅当 \(z_i + u_j \geq m \Leftrightarrow m - u_j \leq z_i\),每个 \((i,j)\) 的贡献则为 \(z_i + u_j + 1 - m\),所以我们维护两个 BIT,分别记录 \(\leq x\) 的个数,与 \(\leq x\) 的贡献和即可。
总复杂度 \(\mathcal{O}(n\log n)\)。
因为 \(\mathrm{Z}\) 函数不是瓶颈,这里用了二分哈希。
首先根号不好处理,取个 \(\log\),得到 \(\log {ans} = \dfrac{\sum\log{v_i}}{c}\)。
这是分数规划,考虑二分一个 \(mid\),则每个模式串的贡献变为 \(v_i - mid\),最后判断是否存在一种字符串的总贡献 \(> 0\)。
关系到模式串匹配问题,考虑在 ACAM 上 DP,设 \(f_{i,j}\) 表示匹配到第 \(i\) 位,当前在自动机 \(j\) 节点上的最大贡献,正常转移即可。
复杂度 \(\mathcal{O}(|\Sigma|ns\log \log V)\)。
2025.2.10
2025.2.12
木莫扌以赛。
A
大意:给定 \(n\) 个数,求出一个排列使得 \(\displaystyle\max_{i=1}^{n-1}(a_{p_i} \oplus a_{p_{i+1}})\) 最小,给出 字典序最小 的方案。
最小答案是好求的,我们找出最大 \(0,1\) 皆存在的二进制位,按照该为分成两部分,答案一定为两个集合中元素的异或最小值,设其为 \(mi\)。
字典序很恶心,我们考虑贪心,设上一个为 \(las\),则我们有两种选择,一种是选择与 \(las\) 在同一集合,为了方案合法,则需要要么另一集合为空,要么还存在其他当前集合的点可以向另一个集合连边。另一种选择时不在一个集合内,则另一个数一定为 \(mi \oplus las\),再判断其是否满足即可。
细节有一坨。
B
呃,首先可以看出重构树,所以得到了个 \(\mathcal{O}\left((nm)^3\right)\) 的暴力做法,40 pts。
然后考虑我们将每个节点的价值设为其 联通块面积 乘上 父亲的权值减自己的,则每放一块海绵,代表这从树上删去一条链,你妈的长链剖分,复杂度 \(\mathcal{O}(nm\log {nm})\)。
C
简单拼包有 70 pts,根本没有往正解去靠。
考虑类似 \(\mathrm{KMP}\),设 \(nx_i\) 表示前 \(i\) 与后 \(i\) 是相似的的最大的 \(i\),然后加入点跳 \(nx\),直到相似,判断是否相似可以用主席树,这样可以做 \(t = 1\) 的。
然后考虑多个串,类比一下,可以想到 \(\mathrm{AC}\) 自动机,就没了。
能想到的诗人我吃。
2025.2.13
抽象题大杂烩 : (
随了一些 CF 题。
I CF1986G2 Permutation Problem (Hard Version)
即求 \(ij \mid p_i \times p_j \Leftrightarrow \dfrac j {p_j} \mid \dfrac {p_i} i\) 的个数,\(i < j\) 可以不用管,可以除 \(2\)。
设 \(a_i = \dfrac {p_i} {(i,p_i)},b_i = \dfrac i {(i,p_i)}\),则式子变为 \(\dfrac{b_j}{a_j} \mid \dfrac{a_i}{b_i} \Leftrightarrow b_jb_i \mid a_ia_j\),又因为 \((a_i,b_i) = 1\),可以拆开得 \(b_i \mid a_j\land b_j \mid a_i\)。
然后我们可以枚举 \(b_i\),设 \(c_x\) 为 \(b_i \mid a_j,b_j = x\) 的个数,则答案即为 \(x \mid a_i\) 的和。
总复杂度 \(\mathcal{O}(n\ln n + n\sqrt{n})\)。
经典题,顺便写下。
替换可以看成删掉一个,再加一个,这样我们先不看删除,则我们需要的是整个图中某些 简单环异或和 的最大值,找出一个生成树,加入一些简单环,可以证明它们的异或和可以代表整个环空间。
则加一条边,相当于多一个简单环,用线性基维护即可,插入与查询都是 \(\mathcal{O}(len)\) 的。
然后考虑删除,线段树分治即可,对于撤销,因为线性基最多增加一个基,所以这里是 \(\mathcal{O}(1)\) 的。
总复杂度 \(\mathcal{O}\left(\dfrac {nlen + qlen\log q} {\omega}\right)\),这里用了 bitset。
一个细节问题,本题有可能 \(q = 0\),所以线段树内需要判非法进入。
点数太多,观察到,一条斜线上的点一定联通,除非其为 \(1\),所以其实只有 \(2n - 1\) 个点,因为有 \(2n - 1\) 条斜线。
然后可以枚举 \(\gcd\),判断相邻的点是否可以相连,用并查集维护,复杂度 \(\mathcal{O}(n\log n\log V)\)。
为了让答案更大,在选定 \(r\) 后选叶子结点一定更优,所以这就类似长剖贪心。
但是我们需要得到每个根的答案,需要换根,需要维护一个链长的 set,用指针维护前 \(k\) 大值,比较难写。
[代码没写]
V CF1973D Cat, Fox and Maximum Array Split
非常好的题。
首先题目中有最大值,我们考虑从最大值入手,可以发现至少有一个区间包含最大值,则可知答案必为最大值的倍数,又因为需要分成 \(k\) 段,则最大倍数只能为 \(\dfrac n k\),然后就可以直接枚举了,找最大值 \(\mathcal{O}(n)\),找答案是 \(\mathcal{O}\left(\dfrac n k \times k\right) = \mathcal{O}(n)\)。
2025.2.14
斩获 250,雀氏是 250。
I 1. 二叉树
简单扫描线。
II 2. 白乌鸦葡萄园
大意:给定一棵树,每个节点有 \(a\) 瓶酒,\(b\) 个人,我们由深至浅考虑,在考虑到 \(x\) 节点时,在 \(x\) 节点上的人可以走到其任意其 祖先节点,但是每两个节点最多只能走 \(c\) 个人,定义权值为 \(\displaystyle\sum_{i=1}^n\min(a_i,b'_i)\),其中 \(b'_i\) 表示考虑到 \(i\) 节点时的 \(b\)。\(n\le 8000\)。
赛时憋了一个假贪心,爆砍 50 pts。
非常好的一题,别样的思路,用 DP 来类似模拟最小割。
考虑网络流,建图是好建的,但是直接 dinic 过不了,转化为最小割,从下往上考虑,对于一个点,要么割掉与汇点的连边,要么割掉与源点的边 + 子树内割掉与汇点连边的数量 \(\times c\),则可以设 \(f_{x,i}\) 表示 \(x\) 子树内有 \(i\) 个点割掉与源点的边数量为 \(i\) 的最小割。
复杂度 \(\mathcal{O}(n^2)\)。
III 3. 合目
大意:给定 \(n\) 个 \(k\) 维点,定义 \(k\) 维曼哈顿距离为 \(d(x,y) = \displaystyle\sum_{i=1}^k|x_i - y_i|\),你需要选定 \(m\) 个点使得 \(\displaystyle\sum_{i=1}^m\sum_{j=i+1}^m d(a_{p_i},a_{p_{i+1}})\) 最大。\(n \le 2\times 10^5,k\le 4,m \le 4\)。
本来以为过不了,但好像常数很小。
首先考虑 \(m = 2\) 的情况,相当于我们需要选两个点 \(i,j\) 求出 \(\max\left(\displaystyle\sum_{w=1}^n|a_{i,w} - b_{i,w}|\right)\)。
一个经典操作是拆绝对值,因为是 \(\max\),所以我们只需拆绝对值后添加一个 正负一 的系数即可。
所以拆成了两个比较独立的东西,类似 \(\displaystyle\sum_{i=1}^n (-1)^{0/1}a_{x,i}\),还需注意,相同维的系数是相反的,所以我们可以状压,设 \(f_{now}\) 表示系数集合为 \(now\) 的最大值,则答案即为 \(\displaystyle\max_{i\in S} f_{i} + f_{S \oplus i}\),复杂度 \(\mathcal{O}(n2^kk + 2^k)\)。
根据这个暴力扩展,对于 \(m = 4\),则每个数在答案中出现了三次,所以可以设 \(g_{i,j,k}\) 表示这三次的 系数集合 分别为 \(i,j,k\) 的最大值,然后我们有六对关系,考虑直接枚举,复杂度 \(\mathcal{O}(n2^{3k} + 2^{6k})\),六层循环的实力。
总复杂度 \(\mathcal{O}\left(n2^{k(m-1)} + 2^{k{m \choose 2}}\right)\)。
2025.2.15
补一些题。
很板,但是这种思想非常重要。
首先线性基合并是 \(\mathcal{O}(\log^2 V)\) 的,需要求的是树上路径的线性基,树剖不是很好,考虑倍增,直接做是 \(\mathcal{O}\left((n + q)\log n\log^2V\right)\) 的,不是很能过,如果你不卡常。
考虑 ST 表上树,先将路径 \(x\to y\) 拆成 \(x \to \mathrm{lca}\) 与 \(y \to \mathrm{lca}\)。
只考虑 \(x \to \mathrm{lca}\),因为重复元素对线性基是没有影响的,所以可以用 ST 表的 思想 再将该区间拆成两端 长度为 \(2\) 的次幂 的段,这样只需一次线性基合并。
复杂度 \(\mathcal{O}(n\log n\log^2V + q\log^2V)\)。
同样的,我们可以考虑 猫树 的思想,改到树上,在树上分治中心相当于点分树,这样不需要倍增,只合并两个区间即可,这种思想也叫做 二区间合并。
复杂度 \(\mathcal{O}(n\log n\log V + q\log^2 V)\),代码写的是第一种。
细节问题比较严重,打代码打了 15min,然后调了 1h,一个细节就是倍增后 \(\mathrm{lca}\) 需要 单独 加上,因为倍增不会加上。
2025.2.16
红红火火恍恍惚惚,偏题怪题选讲。
NOI 出这题好抽象啊
\(k\) 只有 \(15\),可以通过抽屉原理得知若我们将询问串分成 \(16\) 段,则与该串相差 \(< k\) 的模式串至少某一段是 相同的。
所以我们可以暴力枚举这些串,判断是否存在相差 \(< k\) 的串。
基于数据随机,对于每一段期望与询问串相同的有 \(\dfrac n {65536}\) 个,期望总复杂度 \(\mathcal{O}\left(\dfrac{16^2nm}{65536}\right) \approx 2\times 10^8\)。
构造。
一个非常厉害的方法。
首先我们知道前 \(n\) 个奇数的和为 \(n^2\),则我们现在左边为 \(2n - 2\),考虑增加右式,变为 \(2n\)。
则我们需要增加 \(3n^2\),即每个数加 \(3n\),此时左边为 \(2n - 2\),右边为 \(2n\),则我们只需 \(a_1 - 1,a_n + 1\) 即可。
复杂度 \(\mathcal{O}(n)\)。
另一种方法是分讨奇偶,考虑构造平均数为 \(n\) 的数。
LGV 引理板子。
首先考虑 \(k = 2\) 的情况,就相当于求 \(\displaystyle\sum (-1)^{sgn(\sigma)}\prod E_{i,\sigma_i}\),其中 \(E\) 为邻接矩阵。
在考虑 \(k > 2\) 的情况,可以发现一条从第 \(1\) 层到第 \(k\) 层的路径的交点与 直接从第一层连向第 \(k\) 层的正负号是等价的,因为跨越一条线出去还要跨越这条线回来,所以正负号不变。
则最后答案即为 \(\mathrm{det}\left(\prod E_i\right)\),复杂度 \(\mathcal{O}(kn^3)\)。
一个细节问题,变量名问题,注意变量名重复,这个傻逼调了 20 min。
很难一道分析题。
定义 好树 为每个节点的最小子节点大小仅为 \(1\) 的数,可知我们只需要判断是否仅有有限个好树即可。
则我们只需判断 \(4\) 种情况。
- 仅有左子树。
- 仅有右子树。
- 左子树大小为 \(1\),右子树符合。
- 右子树大小为 \(1\),左子树符合。
都满足则可以。
复杂度 \(\mathcal{O}(n)\)。
\(a_i\) 在 \([-1000,1001]\) 中随机生成,也就是说当区间足够大时,总和接近 \(0\),所以我们假定有用的区间比较小,区间长度 \(\ge 2000\) 都不选择。
取个前缀和,答案为 \(\dfrac {s_r - s_{l - 1}}{r - l + 1}\),当枚举到 \(r\) 时,我们先只考虑 \(s_r > s_{l - 1}\) 的部分,剩下的可以全部取负后再做一次。
可以发现我们只需要取单调栈上的 \(s_{l - 1}\),因为其他的一定更劣,我们知道随机序列单调栈大小期望是 \(\log n\) 的,那随机序列的前缀和呢?姑且认为是 \(\mathcal{O}(\sqrt{n})\) 的。
剩下的扫描线即可,复杂度 \(\mathcal{O}(n\sqrt{n}\log n + q\log n)\),可以根号平衡,但是这种做法常数挺小。
可以特判 \(m = 1\) 的情况。
题面比较长,容易分析出的是若自己没有同花顺一定赢不了,因为对手最少可以有个炸弹。
考虑同花顺的情况,当且仅当不存在 公开的 三张牌加上任意两张不能构成更大的同花顺,情况很少,因为必须是同一种颜色。
所以可以得到比自己最大的牌 大 的牌的数量不能超过 \(5\)。
一种特殊情况是 \(A,2,3,4,5\),对手可以 \(10,J,Q,K,A\)。
复杂度 \(\mathcal{O}(1)\)。
VII #75. 【UR #6】智商锁
对于两个图 \(G_1,G_2\),将二者连一条边,生成树数量相当于相乘,也就是说我们可以简单组合两个图。
然后有点难做,考虑随机化,我们随机 \(1000\) 个节点数为 \(21\) 的图,因为图是随机的,且生成树数量比较庞大,所以可以近似认为生成树的数量是随机的,则一共存在 \(1000^4\) 种情况,随机下可以覆盖 \([0,998244353)\) 中的所有数,然后我们考虑枚举 \(G_1,G_2\),用哈希表储存 \(f(G_3)\times f(G_4)\) 即可。
复杂度 \(\mathcal{O}(1000^2\log 10^6)\),因为用的 map。
2025.2.17
I 1. 区间排序
据说是 NOIP 模拟赛 T1,但我真的不会。
考虑到第 \(i\) 条线段,有两种选择,可以考虑容斥,去除掉选择两端没有影响的情况,我们需要对于 \(\le\) 右端点最大左端点的线段,我们需要去除掉前面的贡献,即小于左端点的最大右端点的贡献,这东西非常奇怪,对于 DP 数组,除了 \(f_n\) 其他答案都是错误的,也就是说,这里仅仅为了求 \(f_n\) 的答案进行容斥。
很奇怪。
II 2. a
傻呗题,但是出题人很友好,部分分非常有启发。
对于 W.B 的情况,显然我们不能到 .,因为这不优,所以胜者为可走步数最多的人,对于 W....B 类似,我们需要尽可能走更多的步,所以我们一定向中间走,知道 W.B 的情况。
麻烦的是 WB 的情况,再分讨,若为 WB.,则先手一定吃,然后归到上一种情况,否则为 WBB,假设先手吃,则后手一定吃,判断先手是否必胜,若不必胜,则我们不吃,走其他的棋子,这样递归变为了先后手互换的情况,若两人都不走,则依旧为判断步数大小。
代码多。
III 3. 笛镭特
你说的对,但是我不会 pbds。
一种思路是线段树分裂,但是我没写,写了个启发式分裂 + 平衡树,但是因为不太懂 pbds,貌似假了点东西,挂了 55pts : (
2025.2.18
训练赛捏。
I [ARC125C] LIS to Original Sequence
你说得对,但是我的构造就是使。
考虑构造,对于给定的递增序列,我们分类讨论其他数的取值。
- 对于小于该序列最小值的数,不能放到最前面,因为这样最长上升序列会变大,有因为字典序,我们考虑放到两个数中间,且两个数中间最多只能额外多放一个数,因为会使字典序不优,所以我们可以依次放。
- 对于大于最小值,小于最大值的数,同上,但是要注意不能使最长上升序列变大。
- 对于大于最大值的数,只能放到后面,但是这样字典序不优,考虑放到 最后一个数 与 倒数第二个数 之间,这样最优,注意降序。
如果还有数没填完,只能放到最后。
II [ARC125D] Unique Subsequence
考虑 DP,设 \(f_i\) 表示以 \(i\) 点为结尾的子序列个数,最后为 DP 数组的和。
考虑其 \(a_i\) 上一次出现的时候 \(j\),则有 \(f_j = 0\),因为这些至少存在两个,然后考虑转移,对于 \(k < j\) 的点,一定没有贡献,因为 \(i,j\) 至少出现过两次,对于 \(k \ge j\),我们增加一个 \(a_i\) 一定是新的子序列。
所以用 BIT 维护即可,复杂度 \(\mathcal{O}(n\log n)\)。
III [ARC125E] Snack
比较套路,可以观察到网络流模型,\(S\) 每种零食连 \(a_i\),每个零食向小孩 \(j\) 连 \(b_j\),最后小孩向 \(T\) 连 \(c_j\)。
转化为求最小割,假设我们割 \(k\) 个从源点到每个零食的边,则每个小孩的最小割为 \(\min(c_i,b_i\times(n - k))\),该贡献仅与割多少个边相关,与割的哪几个无关。
所以我们每个 \(k\),贪心选择最小的 \(k\) 个 \(a_i\),对于 \(\min(c_i,b_i\times (n - k))\) 可以发现是 两段一次函数,可以二分交点考虑,也可以直接解交点。
复杂度 \(\mathcal{O}(n\log n)\)。
IV [ARC125F] Tree Degree Subset Sum
很难。
直接做的话是 \(\mathcal{O}(n^3)\) 背包。
首先树貌似没有很大的作用,只限制了 \(\sum d_i = 2n - 2\),考虑每个 \(d_i\) 都先减去 \(1\),则有 \(\sum d_i = n - 2\),这样才能证明下面的结论。
我们设体积为 \(0\) 的物品的数量为 \(z\)。
引理 \(1\):对于每个 \(y\),对于某个合法的 \(x\),则有 \(-z \le y - x \le z - 2\)。
证明:最小的话,我们选择全部的零,则最小显然是 \(-z\)。考虑最大,我们选择所有 \(d_i \le 1\) 的点,最大即为 \((n - 2) - (n - z) = z - 2\)。\(\square\)
引理 \(2\): 对于每个 \(y\),其合法的 \(x\) 构成了一个区间 \([l,r]\)。
证明:对于体积为 \(y\) 的物品,我们设 \(mx\) 表示最大的合法 \(x\),\(mi\) 同理,则我们一定能够表示 \([mi,mi + z]\) 与 \([mx - z,mx]\)。
所以只要我们证明 \(mx - mi + 1\le 2z + 2\Leftrightarrow mx - mi\le 2z + 1\) 即可。
由引理 \(1\) 我们可得 \(-z \le y - mi \le z - 2 \land -z \le y - mx \le z - 2\),合并两个不等式可得 \(2-2z \le mx - mi \le 2z - 2 \le 2z + 1\)。\(\square\)
一般的,若满足 \(\sum d_i \leq (n + 1)\),则存在该结论。
然后就可以转化为 01 背包求最小最大,但是因为 \(\sum d_i = n - 2\),可知本质不同的 \(d_i\) 仅有 \(\sqrt{n}\) 个。
所以相当于 \(\sqrt{n}\) 个物品的多重背包,可以单调队列优化。
但是我不会,只会二进制分组,复杂度 \(\mathcal{O}(n\sqrt{n}\log n)\),实现 6s,其实挺松。
UPD: 貌似有人证明这个东西复杂度就是 \(\mathcal{O}(n\sqrt{n})\) 的,但我不会。
2025.2.19
你说的对,但是 3e5 给我死。
给定 \(n,k \le 10^{11}\),求 \(\displaystyle\sum_{i=1}^n\sum_{j=1}^n[i\bmod j < k]\)。
考虑枚举 \(j\),则可以发现 \(i\) 中存在长度为 \(j\) 的 循环,贡献为 \(\min(i,k)\)。
特殊的,最后一段不是循环的段长度为 \(n \bmod j\),贡献为 \(\min(n \bmod j,k - 1)\)。
得到一种 \(\mathcal{O}(n)\) 做法,式子为 \(\displaystyle\sum_{i=1}^n \left\lfloor\frac{n}{i} \right\rfloor \times \min(i,k) + \min(n \bmod j,k - 1)\)。
左边直接整除分块,右边转成 \(\min(n - \left\lfloor\frac{n}{i} \right\rfloor \times i,k - 1)\) 后,整除分块是一段一次函数,分讨一下即可。
复杂度 \(\mathcal{O}(\sqrt{n})\)。
II 2. 旅行 / UOJ #61. 【UR #5】怎样更有力气
暴力就是 Kruskal。
若 \(p = 0\),没有限制,则考虑 Kruskal 的过程,按照 \(w_i\) 排序,然后尽可能的连边,可以并查集做到均摊 \(\mathcal{O}(\log{n})\)。
加上限制,考虑分讨,还是先排序,设 \(sum\) 表示本轮限制个数。
-
若 \(dis(x,y) > sum\),则相当于没有点被 隔离,就是说我们还是可以尽可能的连边,用 \(p = 0\) 的做法即可。
-
若 \(dis(x,y) \le sum\),则所有路径的节点总和是 \(\mathcal{O}(p)\) 的,考虑利用这个来做。
我们将所有限制当成 边,考虑找到度数最小的点,一个结论是度数最小的点的度数最大为 \(\mathcal{O}(\sqrt{p})\) 的。
设该点为 \(x\),则 \(x\) 将所有点分成了两部分,与其相连的 与其他,首先其他点是可以向 \(x\) 直接连边的。
然后考虑与其相连的点 \(y\),有两种连边。
- 一是向内部连边,暴力做就是 \(\mathcal{O}\left({\sqrt{k}}^2\right) = \mathcal{O}(k)\) 的。
- 二是向外部连边,设外部点的个数为 \(s\)。
- 若 \(d_y < s\),则一定存在一个外部点可以连边,所以我们可以直接连到 \(x\)。
- 否则暴力枚举是 \(\mathcal{O}(\sum d_i) = \mathcal{O}(k)\) 的。
其中连边都可以用并查集维护。
总复杂度 \(\mathcal{O}(n\log n)\)。
III 3. 水晶
很奇特的 DP。
首先对于一个染色情况,其实唯一对应 \(d_i\) 的分布,而互补的染色情况的答案又是相同的,所以我们可以只求一种乘 \(2\) 即可。
因为唯一对应,考虑设 \(f_{x,i}\) 表示 \(x\) 子树内 \(d_x = i\) 的贡献,但是这可能不合法,因为需要满足至少存在一个 异色 或者 一个 \(y\) 使得 \(d_y = d_x - 1\)。
所以考虑扩展状态,设 \(f_{x,i,0/1}\) 表示 \(x\) 子树内 \(d_x = i\) 且是否存在上述情况的贡献,最后就是 \(f_{1,i,1}\) 的和。
那么怎么转移呢,考虑到相邻的 \(d_x\) 相差不会超过 \(1\)。
- 若 \(i \not= 1\)。
- \(f_{x,i,1} \gets f_{x,i,1} \times (f_{y,i + 1,1} + f_{y,i,1} + f_{y,i - 1,1} + f_{y,i + 1,0}) + f_{x,i,0} \times f_{y,i - 1,1}\)
- \(f_{x,i,0} \gets f_{x,i,0} \times (f_{y,i + 1,1} + f_{y,i,1} + f_{y,i + 1,0})\)
- 若 \(i = 1\)。
- \(f_{x,1,1} \gets f_{x,1,1} \times (f_{y,2,1} + f_{y,2,0} + 2f_{y,1,1} + f_{y,1,0}) + f_{x,1,0} \times (f_{y,1,1} + f_{y,1,0})\),这里两个 \(f_{y,1,1}\) 表示的是 同色 与 异色 的转移。
- \(f_{x,1,0} \gets f_{x,1,0} \times (f_{y,2,1} + f_{y,2,0} + f_{y,1,1})\)
对于 \(k\) 次方,每个维护 \(0\sim k\) 次方,二项式定理合并即可。
复杂度 \(\mathcal{O}(n^2k)\)。
2025.2.20
奇淫技巧大合集。
技巧:假设未知数,推导一次函数,避免了高斯消元。
复杂度 \(\mathcal{O}(n)\)。
用 set 实时维护虚树,根据 \(dfn\) 序求前驱后继。
复杂度 \(\mathcal{O}(n\log n)\)。
III QOJ # 3770. Minimum Spanning Tree
结论:最优解只出现在两端,最小生成树关于 \(x\) 是凸的。
证明:对于一颗生成树,关于 \(x\) 的变化是一个一次函数,则取 \(\min\) 即为一个凸函数,显然两端最优。
复杂度 \(\mathcal{O}(n\log n)\)。
首先每行每列一定存在一次即有 \(\displaystyle\sum_{i=1}^n\sum_{j=1}^m \gcd(i,a) + \gcd(j,b)\)。
然后考虑贪心,我们尽量走与 \((a,b)\) 都互质的路,考虑最大与 \((a,b)\) 互质对 \((x,y)\),首先有 \((x - 1) + (y - 1)\) 的贡献。
结论:在 long long 值域下,每两个素数间隔不超过 \(50\)。
证明:其与连续的 \(50\) 个数不互质,则最小为 \(2 \times 3 \times \cdots \times 47 \approx 10^{19}\)。\(\square\)
所以此时 \(n - x\) 与 \(n - y\) 都极小,平方 DP 即可。
复杂度 \(\mathcal{O}(n)\)。
即在线求直径。
注:这里的欧拉序是指每 经过一个子树 就加点的,点数为度数和,与树上莫队的欧拉序不同。
欧拉序的一个结论:两点中间深度最小的节点即为两点的 \(lca\)。
直径即为 \(d_x + d_y - 2 \times d_{lca}\),所以我们线段树维护欧拉序即可。
VI P4745 [CERC2017] Gambling Guide
首先列出期望方程 \(f_x = \dfrac {\sum \min(f_y,f_x)}{d_x} + 1\)。
可知大于等于 \(f_x\) 的 \(y\) 都是没用的,我们假设 \(< f_x\) 的 \(y\) 有 \(cnt_x\) 个,则 \(f_{x} = \dfrac{\sum f_y}{d_x} + \dfrac {(d_x - cnt_x)f_x}{d_x} + 1\)。
适当转化一下可得,\(f_x = \dfrac{d_x + \sum f_y}{cnt_x}\)。
可以发现这类似于一个 dijkstra,复杂度 \(\mathcal{O}(n\log n)\)。
VII QOJ # 9854. Find the Maximum
\(\dfrac{\sum -x^2 + b_ix}{|V|} = -x^2 + \overline{b_u}x \le \dfrac {\overline{b_u}^2} 4\)。
所以我们只关心最大平均值,该怎么求呢,二分,感觉是个不错的方法,但是需要的精度太高,貌似会 T。
结论:我们只会选 \(\le 3\) 个点。
证明:因为如果我们选 \(4\) 个点,我们把其分成上下两部分,一定有一部分的平均值更大。
复杂度 \(\mathcal{O}(n)\)。
VIII CF1622E Math Test
经典技巧:\(\max\) 绝对值,拆开,加正负一系数。
然后贪心即可,复杂度 \(\mathcal{O}(2^nm\log m)\)。
2025.2.23
ha... 思维难题,拼尽全力啥都没得到。
两种做法,多项式推以及思维,没事,我都不会。
转化题意,我们每次找的就是笛卡尔树上的 LCA,所以只要笛卡尔树同构,两个序列就同构。
然后还需要 \([1,m]\) 中的数都出现过,可以发现对于一个数列不完全出现过 \([1,m]\) 中的数,那么我们可以进行一些转换,使得包含 \([1,m]\) 中所有数,且其笛卡尔树 结构不变。
对于重复的数,改变深度最小的数,将其改变为比它大的未出现的数,然后向上传递,直到符合大根堆性质,这样结构不会变,但是多了一种数,一直进行下去即可。
所以我们就无需考虑值域的问题,简化了问题,现在转化为,对于一颗笛卡尔树的某个点 \(x\),其左边的点都 小于 它,右边的点都 小于等于 它,所以每个点向左的深度不能够超过 \(m\),不然就不够。
此时就可以 DP 了,但我不会多项式与生成函数。
但是我们可以进一步转化,我们知道对于一个简单树,用 左儿子右兄弟 的方法可以唯一对应出一颗二叉树,所以也可以对应回去。
对应成一颗树后,转化为一个 \(n + 1\) 个节点的树(根深度为 \(0\)),其深度不超过 \(m\) 的树的方案数。
还是不好做,继续转化,一颗树可以对应成一个合法括号序列,可以先将根去掉,变成长度为 \(2n\) 的括号序列,若设左括号为 \(1\),右括号为 \(-1\),则即求每个前缀和都不超过 \(m\) 的方案数。
这就是经典的格路问题,我们从 \((0,0)\) 开始走,每次选择 向右 或 向上 走,最后走到 \((n,n)\),则上述限制就是不能够碰到 \(y = x - (m + 1)\) 这条线,并且我们还需要满足这是一个合法的括号序列,所以也不能碰到 \(y = x + 1\)。
反射容斥(或者叫双线法)即可。
2025.2.24
贪心,一个结论是对于一个存在比较符的一些值,在树上,一定存在一个最优方案,最小的值(基于比较符的)恰好在其父亲之后,也就是说我们可以根据这个直接合并。
如何比较呢,可以发现因为只有 0/1,所以两个块 \((x_0,x_1),(y_0,y_1)\),若安排 \(x,y\) 则费用为 \(x_1 \times y_0\),所以我们根据 \(F(x,y)\) 与 \(F(y,x)\) 的大小比较即可。
总复杂度 \(\mathcal{O}(n\log n)\)。
II 2. goodper
题意:对于一个排列,其是 好 的当且仅当对于 \(i\in [1,n - 1]\) 都有 \(|p_i - p_{i+1}| \ge \min(p_i,p_{i+1})\),初始给定某些固定值,\(n\le 39\),\(n\) 为奇数。
比较厉害的状压。
条件即为相邻两数大的至少是小的的两倍,令 \(m = \frac {n + 1} 2\),可以发现,对于大于等于 \(m\) 的数,这些数不能相邻,而一共有 \(\frac {n + 1} 2\) 个,所以我们一定会将这些数放到排列的 奇数位,剩下的即在偶数位。
而如果我们确定了一个奇数位,偶数位的方案我们可以得到一些 \(\le\) 的限制,从而可以直接计算方案数。
所以我们状压奇数位,从小到大加入 \(\le m\) 的数,这样若对于新加到 \(i\) 的奇数位,则因为从小到大,其左右两边 偶数位 的取值范围也就定了,所以可以直接计算。
然后考虑给定的某些值,特殊判断即可,取值范围需要去掉一些 已有的数。
复杂度 \(\mathcal{O}(m2^m)\)。
2025.2.25
goooooooooooood 题。
首先转化为一个集合不存在 大小为偶数的子集,使得其异或和为 \(0\),即不存在两个大小奇偶相同的不同子集异或和相同。
所以可以得到一个结论,不存在大小 \(> n + 1\) 的子集满足条件,因为对于其偶数/奇数大小集合,它们子集个数 \(> 2^n\),根据抽屉原理,一定存在两个相同。
所以我们可以考虑设 \(f_i\) 表示集合大小为 \(i\) 的合法子集方案。
考虑加入一个数,则对于先前集合内所有大小为奇数的子集都不可行,因为我可以令加入的数与其相同,需要减去,即 \(2^{i - 2}\)。
但是这样会不会多减呢,是不会的,因为先前的集合满足所有 奇数子集异或和 都不相同,不然就不合法了。
所以有转移 \(f_i = f_{i - 1} \times (2^n - 2^{i - 2})\),\(f_1\) 直接求就行了,注意我们求的是有标号的,需要除 \(i!\)。
复杂度 \(\mathcal{O}(n)\)。
2025.2.26
II [ABC233Ex] Manhattan Christmas Tree
对于切比雪夫距离,其优势是与点 \(x\) 距离 \(\le d\) 的区间是一个矩形,可以上 ds,对于曼哈顿距离,其优势是没有 \(\max\) 的干扰,可以更好处理。
本题利用了切比雪夫距离的优势,我们二分后,相当于求与当前点距离 \(\le mid\) 的点有多少,所以曼哈顿转切比雪夫后可以求矩阵和,用主席树维护。
复杂度 \(\mathcal{O}(n\log^2 n)\)。
2025.3.11
不好。
对于一颗生成树其贡献为 \(\displaystyle\prod_{e\in T}p_e\prod_{e\not\in T}(1 - p_e)\),很像矩阵树的贡献,但是矩阵树求的是 仅与生成树相关 的贡献,考虑转化,\(\displaystyle\prod_{e\not \in T}(1 - p_e) = \dfrac {\prod_{e\in E}(1 - p_e)}{\prod_{e\in T}(1 - p_e)}\)。
上面的是个整体,与树无关,所以最后要求的即为 \(\displaystyle\prod_{e\in T}\dfrac{p_e}{1 - p_e}\),这样就可以矩阵树了。
复杂度 \(\mathcal{O}(n^3)\)。
2025.3.12
依旧不好。
希望写点线代笔记,线代不会了。
矩阵树板子,注意行列式求法。
首先需要枚举 \(\gcd\),设 \(f_i\) 表示生成树 \(\gcd\) 为 \(i\) 的倍数的贡献,\(g_i\) 表示生成树 \(\gcd\) 恰好为 \(i\) 的贡献,可以 \(\mathcal{O}(V\ln V)\) 容斥,具体的,\(g_i = f_i - \displaystyle\sum_{i|j}g_j\),是调和级数。
剩下要考虑的就是存在一些 边权 为 \(i\) 的倍数的边,一个生成树的贡献是 \(\displaystyle\sum_{e\in T}w_e\),考虑矩阵树,但是和比较难办,考虑将其转换成乘法,因为乘法就相当于多了几条 重边,可以直接矩阵树。怎么转化,考虑将一条边权值 \(w\) 变为一个多项式 \(1 + wx\),则两个权值相乘,得到的 一次项系数 就是权值相加,所以我们维护多项式即可。
- \((a + bx)(c + dx) = ac + (ad + bc)x\pmod {x^2}\)
- \(\dfrac{a + bx}{c + dx} = \dfrac{(a + bx)(c - dx)}{c^2 - d^2x^2} = \dfrac{ac + (bc - ad)x}{c^2}\pmod{x^2}\)
枚举所有数复杂度会爆,考虑到答案可能不为 \(0\) 的数只有连接某点的边权的因数,只有 \(\tau(V)n\) 个,大约为 \(128n\)。
总复杂度 \(\mathcal{O}\left(\tau(V)n^4\right)\)。
板子捏~
一个生成树的权值为 \(\left(\displaystyle\sum_{e\in T}w_e\right)^k\),直接不能矩阵树,但是矩阵树的权值可以是一个 满足四则运算 的任意一个类型,只需将其贡献考虑为 积 的形式即可,转化为多项式,\([x^n]f\) 表示 \(n\) 次方贡献和,则有 \([x^n]f \ast g = \displaystyle\sum_{i=0}^n\dbinom{n}{i}f(i)g(n - i)\),即二次项定理。
则我们维护该多项式,四则运算都可以最坏 \(\mathcal{O}(k^2)\) 复杂度求出。
总复杂度 \(\mathcal{O}(n^3k^2)\)。
这还是一个生成函数,我不会。
生成树数量第一时间想到的是 \(\mathrm{prufer}\) 序列与矩阵树,但我不会 \(\mathrm{prufer}\) 序列。
考虑将 树边 边权设为变量 \(x\),其他边设为 \(1\),则最后矩阵树下,答案即为 \(k\) 次项系数,但是这样复杂度 \(\mathcal{O}(n^5)\),过不了。
我们考虑不计算多项式,带入 \(n\) 个不同的 \(x\) 进去,剩下的是一些多元一次方程组,可以高斯消元,复杂度 \(\mathcal{O}(n^4)\)。
本题存在 \(\mathcal{O}(n^2)\) 解。
2025.3.13
不好。
\(\mathrm{BEST}\) 定理:一个有向欧拉图的欧拉回路个数为其 内向树 个数乘上 \(\displaystyle\prod_{i=1}^n(d_i - 1)!\),其中 \(d_i\) 为度数,等于出度与入度。
本题我们考虑枚举其中一个方向的边数,则可以直接推出所有边的个数,答案即为 从 \(1\) 开始的 欧拉回路个数,需要额外乘上 \(d_1\)。
注意 同向同始末 的边是等价的,但我们求的是有区别的,需要除阶乘。
复杂度 \(\mathcal{O}(A)\)。
给定 \(n\) 个线性无关的 \(n\) 维向量,又给定了 \(n\) 个备用向量,问是否存在一种方案可以恰好每个初始向量都能够找到一个备用向量,一个备用向量只能选一次,判断解,并求字典序最小解。
假设我们知道了每个向量可以被哪几个备用向量所替代,则剩下的问题就是二分图字典序最小完美匹配,这是好办的。
考虑如何求某个向量能否被代替,即剩下 \(n - 1\) 个向量不可通过线性变换得到的备用向量,设 \(A = [A_1,A_2,\cdots,A_n]\),因为 \(A\) 的所有线性变换构成了 \(\mathbb{R}^n\),所以任意一个向量 \(P\) 都可以 唯一存在 一个变换向量 \(\mathrm{R}\) 使得 \(P = A \ast \mathrm{R}\)。
考虑第 \(i\) 个备用向量 \(B_i\),则同样唯一存在一个变换向量 \(\mathrm{R}\) 使得 \(B_i = A \ast \mathrm{R}\),我们考虑这个 \(\mathrm{R}\),若其中第 \(j\) 维元素为 \(0\),则说明 \(B_i\) 可以被剩下 \(n - 1\) 个向量线性表示出来,说明这个备用向量 不可以代替 第 \(j\) 个初始向量,这样我们求出 \(A\) 的逆,一次的复杂度为 \(\mathcal{O}(n^2)\)。
总复杂度 \(\mathcal{O}(n^3)\),为了方便,\(n\) 个备用向量可以放一块组成矩阵 \(B = [B_1,B_2,\cdots,B_n]\)。

浙公网安备 33010602011771号