2025 山东二轮省集
第一轮的时候太懒了,二轮写一个。
Day 0
热身赛,\(100 + 100 + 52\)。
好像是以前省集的题目,所以没什么人打。
T1
考虑 \(2^n\) 的容斥,直接钦定一些边不选即可。
然后再考虑树上 DP,设 \(f_{i,j}\) 为考虑 \(i\) 的子树,\(i\) 所在的联通块大小为 \(j\) 的所有容斥系数的和。转移类似树上背包,直接做时间复杂度 \(O(n^2)\)。
T2
凸包点数大概是 \(O(n^{\frac{3}{2}})\) 规模的,直接暴力合并就可以了。
T3
单峰序列可以直接分为为一段升一段降。进一步的这相当于把一些位置变为 \(2n - a_i\),然后求总逆序对数。发现一些简单的性质:
对于 \(i<j\) 且 \(a_i > a_j\),着一对数本身就对逆序对数有 \(1\) 的贡献,且能变成顺序对当且仅当对 \(j\) 进行变化。和 \(i\) 没有关系。
对于 \(i<j\) 且 \(a_i < a_j\),这一对数能变成逆序对也当且仅当对 \(i\) 进行变化,和 \(j\) 没有关系。
这样每一位的贡献就是独立的了,直接做可以解决 \(t = 0\)(一次询问)的情况。
对于问每个前缀,我们要做的就是区间减一,单点加,然后对 \(0\) 取 \(\max\)。用吉司机可以直接暴力。然后早 20 分钟走我就没写完,更好的方法是每个数只会变成 \(0\) 一次,在他变成 \(0\) 的时候把它取出来就可以了。
没有写。
Day 1
\(100 + 50 + 35\),怎么大家都不打暴力呀(
T1
根据我们小学学过的树的直径知识得到如果两个点可以互相到达,那么一定可以通过走直径做到走 \(3\) 次,然后走 \(1\) 次是简单的,接下来只需要判断能不能两次到达,即存在一个点 \(p\) 使得 \(dis(x,p) \ge k \land dis(y,p) \ge k\)。
一个简单的方法是取 \(x,y\) 的路径向下取整的中点 \(z\),设 \(dep_x > dep_y\) 则 \(z\) 子树内的点离 \(x\) 更近,之外的点离 \(y\) 更近,只需要对每个点 check 离他更近的那些点离他距离是否 \(\ge k\) 即可。将所有询问离线,DFS 一遍维护点到所有点的距离即可。
T2
先考虑怎么求一个图 \(G\) 的 \(f(G)\)。强连通分量连成一个环即可。接下来只考虑 DAG。按拓扑序倒序加入点,一个点只保留自己和连接的所有出点中,不能被其他出点到达的那些点连边。
直接暴力建图有 \(O(n^2)\) 做法,\(m = 0\) 的时候我写了一个 cdq 优化建图。
考虑正解。主席树等建图方式有点麻烦,现在考虑神秘的建图方式:kosaraju。
按照 kosaraju 的方式缩强连通分量,DFS 的时候相当于找到编号小于自己的并且 \(a_i\) 最小,或者编号大于自己的 \(b_i\) 最大的。
因为只需要 DFS,不需要记别的东西,我们就可以轻松求出所有强连通分量并按他们的拓扑序排序。
下面我们按照如下方式获取强连通分量之间的连边:
倒序遍历所有强连通分量,并维护当前形成的 DAG。维护每个点的入度,遍历到一个点 \(i\) 时先找到所有入度为 \(0\) 的点 \(x\),如果有 \(i \rightarrow x\) 则没有问题,否则将 \(x\) 删掉并更新其他点的出度。由于零度点间两两没有连边,又有只删了 \(m\) 条边,故零度点是 \(O(\sqrt m)\) 级别的。总时间复杂度 \(O((n+m)\sqrt m)\)。
实现的时候记 \(d_{x,y}\) 为 \(x,y\) 之间被删的边数。则 \(d_{x,y} < sz_x * sz_y\) 时,两个强连通分量之间有连边。
T3
to be done.
CF1394D
如果说所有 \(b_i\) 都相等,那么事情就变得简单了——直接将所有 \(b_u > b_v\) 的边定向为 \(u \rightarrow v\),经过每个点的链的条数就是入度和出度的最小值。
如果 \(b_u = b_v\),那么边 \((u,v)\) 可以任意定向。直接设 DP。设 \(f_{i,0/1}\) 为 \(i\) 的子树中的最小花费,其中 \(i\) 到父亲的连边被定向为指向父亲/指向自己。
转移的时候先钦定儿子全选 \(f_{i,0}\),然后枚举 \(1\) 的个数,选 \(f_{i,1} - f_{i,0}\) 最小的那些点,对儿子排个序就行。时间复杂度 \(O(n\log n)\)。
LOJ6669
首先问出每个点的深度。
此时询问两个点的距离就可以知道两点 \(LCA\) 的深度。对原树树链剖分,先询问根所在重链链底到 \(x\) 的距离,就可以直接算出 \(x\) 和该重链的 \(LCA\) 位置,如果深度一样说明找到了,否则因为是二叉树,往另外一条边上走就可以了。每个点加入时都重新树剖一次,询问次数 \(n\log n\)。
UOJ618
奇数个点时显然答案为一。
偶数个点时重心是一条 \(x \rightarrow y\) 的链,并且两边的子树分别有 \(\dfrac{k}{2}\) 个点。
看到链发现可以点分治直接暴力。但是有更好的做法。
定义一条边的权值是他两边子树大小的最小值,发现上面的合法路径一定满足链上的所有边权值都 \(\ge k\)。
直接权值从大到小枚举边,用并查集合并并且维护连通块的直径,时间复杂度 \(O(n \log n)\),如果可以 \(O(n) - O(1)\) \(\text{rmq}\),就是线性的了。
UOJ33
直接长剖并且暴力计算,时间复杂度不能接受。
考虑根号分治,计算的长度大于 \(B\) 时我们直接暴力跳,时间复杂度 \(O(\dfrac{n^2}{B})\),小于 \(B\) 时对于每一种长度我们都暴力遍历一遍,具体地是设 \(cnt_i\) 为与点 \(i\) 距离是 \(k\) 的倍数的点数,直接用 \(cnt_i\) 更新 \(cnt_{fa_{i,k}}\) 即可。(\(fa_{i,k}\) 是 \(i\) 的 \(k\) 级祖先)。
代码抄的某位神仙的,写的十分精妙。
CF830E
Day 2
\(100 + 10 + 0\),T3 纯暴力都挂了。
T1
先拆贡献,设 \(t_i\) 代表 \([0,i]\) 的所有数是否全部出现过,那么一个序列的 \(\operatorname{mex}\) 可以表示成 \(\sum t_i\)。
直接暴力求出 \(t_i\) 是 \(O(n^2)\) 的,总时间 \(O(n^3)\),比较不优。考虑将所有 \(t_i\) 一块计算。考虑容斥,那么:
其中 \(c_i\) 是 \(S\) 中小于等于 \(b_i\) 的数的个数。
这样就可以直接 DP 了。将所有的 \(b_i\) 从小到大排序,转移时记录已经选了几个数即可,需要预处理 \(b_i\) 一段后缀减 \(k\) 后的乘积。时间复杂度 \(O(n^2)\)。
T2
考虑生成一张 \(K\) 行 \(N\) 列的矩阵,第 \(i\) 行填上 \(b_i\),把它消元成一个简化阶梯形矩阵,去掉全 \(0\) 行后即为 \(b_1,b_2,\cdots,b_K\) 张成的线性空间对应的简化阶梯形矩阵,该线性空间的秩即为矩阵的行数。接下来只需对于所有包含该线性空间且最大值 \(\ge X\) 的线性空间,计算恰好张成它的序列个数之和。
先考虑对于给定的一个线性空间,计算有多少序列 \(a_1,a_2,\cdots,a_M\) 的恰好张成它。设该线性空间的秩为 \(r\),所求即为有多少 \(M\) 行 \(r\) 列的矩阵满秩,即要求这 \(r\) 列线性无关。所以考虑一列一列地填,第一列的方案数为 \(2^M-1\),第二列的方案数为 \(2^M-2\),\(\cdots\),第 \(r\) 列的方案数为 \(2^M-2^{r-1}\)。因此方案数为 \(\prod\limits_{i=0}^{r-1}\left(2^M-2^i\right)\)。
回到原问题,可以看成在原矩阵中新增一些主元列,并添加对应的行,这一行在其他主元列的位置上全为 \(0\)。考虑新增一行对最大值的贡献,如果原本的最大值在这一列上已经是 \(1\),则该行对最大值没有贡献,否则最大值需异或上该行的值。
现在考虑 dp 方案数,需要记录的状态有:现在考虑了 \(i\sim n-1\) 列,新增了 \(j\) 行,当前是否有新增的行对最大值有贡献,当前最大值与 \(X\) 的 \(i\sim n-1\) 位是否一致。转移时分类讨论即可,细节较多。需要注意到如果一列不是主元列,那么如果有新增的行对最大值有贡献,则各有 \(2^{j-1}\) 种方案使得最大值在该列的取值为 \(0\) 或 \(1\),否则 \(2^j\) 种方案中,最大值在该列的取值是固定的。
时间复杂度为 \(\mathcal O\left(\dfrac{NK^2}{\omega}+N^2\right)\)。
T3
题解运用了转置原理,感觉非常抽象。这是讲的一种直接做的方法:(类似于这个)。
区间加直接维护,更新 \(b\) 序列的时候,\(\text{down(i,x,y)}\) 表示将 \(i\) 代表的区间 \([l,r]\) 中的所有 \(b_i\) 对 \(y + \max(x,\max_{j=l}^i a_j)\) 取\(\min\),线段树只需要维护区间加法和区间取 \(\min\) 的 \(tag\),以及一个 \(val\) 表示将右子树的 \(b_i\) 对 \(val + \max(leftmax,premax)\) 取 \(\min\),下传标记时容易单侧递归实现。
是不是很不清楚。看代码之后应该就没啥问题。
CF1514E
CF1535F
CF1508D
CF1603D
ARC153E
Day 3
\(85 + 0 + 0\),被 T1 创了,写挂了。
T1
赛时写错了,第一个包没过。
首先将顺时针和逆时针的答案记下来,在钦定所有路线按顺时针运行。
现在我们要选择一些路径反转方向,使得反转完后依然合法,并记下他们的答案。
一个不是很难看出的结论是:如果反转了两个不交的路径,那么所有路径都得跟着他们一起反转。因此所有反转的路径的交应不为空。
而此时不反转的路径一定在这些交内,又有反转路径的长度一定大于等于这些交,不反转路径的长度一定小于等于这些交,因此反转的路径一定是将路径按顺时针时长度从大到小排序后的一段前缀。
枚举所有的前缀,判断其合不合法即可。一段前缀合法当且仅当前缀中的每个区间都包含了其他的每个区间。可以用扫描线求出一段区间不包含的区间的编号最大值,用树状数组维护,时间复杂度 \(O(n \log n)\)。
std 是线性的,没仔细想。
T2
atcoder 的一个题,比较有趣(上一个题好像也是 atcoder 的)。
直接建一个二分图,两边各 \(45\) 个点。直接两两连出所有边权,共计 \(92\) 个点。
关键的部分:将值域序列两两分一组,按照出没出现有 \((0,0),(0,1),(1,0),(1,1)\) 四种情况,其中 \((0,0)\) 不用管它,建出两个源点,按照下图方式连边,此时数的数量变成原来的 \(\frac12\),三个等价类在再按照第一种方法连边。共计 \(69\) 个点。(讲不清楚了,我语言组织能力一流。)

将上面的两两分一组,改成 \(3,4\) 个一组,可以继续减少点数。
\(4\) 个一组时,看起来有 \(16\) 个等价类,但是可以强制钦定第一个位置为 \(1\)(第一个位置不是 \(1\) 就扔掉这一位,继续往后找)。等价类就变成了 \(8\) 个。继续将四个源点只保留一个,改为每个等价类的第一的数之间连边(如果等价类没有数就新建一个)。最后将汇点扔掉,将第二层点的最后一个作为汇点即可。共计 \(53\) 个点,做完了。
T3
to be done.
Day 4
\(80 + 5 + 15\) 大众分,没人过题,不好评价。
T1,T2,T3
to be done.
Day 5
\(80 + 0 + 5\),没过 T1 鱼鱼了。
T1
注意到两个数之间是否互质之和他们包含的质因子有关,和数量无关。然后 \(n\) 最多只有 \(13\) 个质因子。状态数 \(2^{13}\) 直接矩阵快速幂,不如暴力。
注意到在 \(n\) 中出现次数相同的质因子在转移时的系数是没有区别的。于是对于出现次数相同的质因子,只需要记录出现了多少种即可。状态数只有 \(144\),至此 \(80\) 分。
直接矩阵快速幂复杂度是 \(O(q144^3\log m)\) 的不可取,但是我自始至终也没发现一个重要的事情:最后统计答案的时候是一个向量乘若干个矩阵,一次乘法其实是 \(O(n^2)\) 的。如果把 \(2\) 的整次幂次方的转移矩阵全预处理出来,然后每次询问的时候用初始的向量一个一个去乘即可。
T2
过了很多人。感觉我一点不会这种东西。
设 \(f_{i,j}\) 为 \(i\) 子树内最小值为 \(j\) 的路径数量。考虑怎么从 \(y\) 转移到其父亲 \(x\)。
设 \(mn_x\) 为 \(x\) 子树中的最小值,\(rk_x\) 为 \(x\) 在所有兄弟的 \(mn\) 中的排名。那么计算 \(x \rightarrow z(z \in subtree(y))\) 有如下转移:
- 最小值在 \(y\) 子树内取到,有 \(f_{y,j} \frac{1}{rk_j} \rightarrow f_{x,j}\)。(所有 \(mn\) 小于 \(j\) 的都在他后面遍历)。
- 最小值不在 \(y\) 子树内,而在 \(z\) 子树内取到,这个又有两种:
- \(mn_z < mn_y\),有 \(\sum\limits_{mn_p>mn_z,k>mn_z}f_{p,k} \frac{1}{rk_j (rk_j+1)} \rightarrow f_{x,mn_z}\)。
- \(mn_z > mn_y\),有 \(\sum\limits_{mn_p<mn_z,k>mn_z}f_{p,k} \frac{1}{rk_j (rk_j-1)} \rightarrow f_{x,mn_z}\)。
直接线段树合并维护,对于最后两种转移,可以将子树按照 \(mn\) 排序,然后建出前缀和后缀的线段树的并查询即可。细节比较多。
T3
to be done.
Day 6
\(100 + 60 + 28\),T1 做的时间有点长,要不然做出 T2 还有点希望!
T1
显然你可以做到三个格子翻两倍,五个格子翻三倍等。但是你发现都行不通,甚至连 \(10^{100}\) 都摸不到。这个时候就有一个天才的想法:构造斐波那契数列。你可以做到两步推进数列的一项,然后你还发现斐波那契数列的第 \(48\) 项刚好是 \(9 \times 10^{99}\),看着就很对。这个东西还有很好的性质:一个数一定可以拆成斐波那契数列的若干项和,且项数不超过一半,如果超过一半显然可以调整,让两个连续的项 \(f_i,f_{i-1}\) 变成 \(f_{i+1}\)。这样就完美符合题目的条件了。

T2
容易观察到匹配是不交的。直接区间 DP 可以获得 \(45\) 分。
考虑只有 \(a,b\) 时的答案。发现从左向右扫序列时,尚未匹配的一定都是同一种字符,否则可以将尚未匹配的先匹配上,答案也可以拆贡献,\(\left|i-j\right|\) 相当于在 \(j\) 处减 \(j\),在 \(i\) 处加 \(i\)。这样直接设 \(f_{i,j,k,0/1}\) 表示前 \(i\) 位中,保留(扔掉)了 \(k\) 个位置,当前还有 \(j\) 个 \(a/b\) 没有匹配的最大权值。转移是平凡的。可以获得 \(60\) 分。
字符集更大的时候,上面的结论就失效了。我的思考就到此为止,但是我们还能有更强的结论:
加入字符 \(c\) 的时候,当前未匹配的点要么全是 \(c\),要么全不是 \(c\)。
直接设 \(f_{i,j,k,c,0/1}\) 为前 \(i\) 个数中,保留了 \(k\) 个位置,有 \(j\) 个数尚未匹配,并且这 \(j\) 个数都是/都不是 \(c\)。转移有点细节但还算平凡。注意 \((c,0)\) 和 \((c^{\prime} \neq c,1)\) 这些状态是互通的,然后当栈清空的时候,这个状态可以转移到所有其他状态。
T3
有点难。to be done.
Day 7
\(100 + 40 + 0\),T3 挂没了。
T1
比赛开始的时候先睡了一个小时,然后起来发现根本不会做,一想那个时候简直糖丸了。
可以说是几天最简单的题。不想写题解了。
T2
直接枚举三条边暴力判断,时间复杂度 \(O(m^3(n+m))\),理论上只能通过 \(m \le 80\),但是好像 \(m \le 200\) 也过了?
仔细一想 Tarjan 是不必要的。只需要判断 \(1\) 能否到达所有点和所有点能否到达 \(1\) 即可,可以用 bitset 优化 \(BFS\),总时间复杂度 \(\dfrac{m^3n^2}{w}\)。
考虑继续优化,把上面 \(BFS\) 的树拿出来,显然这些边至少要删一条,要不然一定还是强连通。且这些边只有 \(2(n-1)\) 条,于是可以据此暴搜。
设 \(Solve(E,k)\) 代表从边集 \(E\) 中删掉 \(k\) 条使其不强连通的方案。那么首先当图本来就不强连通则返回 \(\dbinom{\left|E\right|}{k}\),否则枚举 \(BFS\) 树上的一条边,调用 \(Solve(E - e,k - 1)\) 即可。时间复杂度 \(O(\dfrac{n^5}{w})\)。细节很多,要注意不能算重。
Day 8
这辈子打得最烂的一场模拟赛,\(55 + 0 + 10\)。不好评价我赛时的状态。
T1
一开始连 \(O(nq)\) 之类的都不会。
考虑一个贪心:从左到右扫括号序列,遇到第一个右括号数量 > 左括号数量的位置,此时必然有一个右括号会被反转,直接选一个代价最小的即可。然后选择的左括号一定都在右括号后面,所以前后是互不影响的。
这个时候问题就变成了给你若干个前缀(位置固定),可以修改一个位置的值,然后询问上面问题的答案。直接 \(O(nq\log n)\) 暴力可以拿 \(55\) 分,我也就会这点分了。
带修改的时候怎么做呢?一个重要的想法是,我们不考虑那个前缀究竟匹配了那些点,我们只需要关注有哪些点被选中了。设一个前缀的排名是 \(rk_i\),在它前面的点数是 \(s_i\),只要对于 \(\forall i,rk_i \le s_i\),那么这个匹配就合法。当插入一个数的时候,设这个数在前缀 \(p\) 到 \(p + 1\) 之间,只要找到最靠后的 \(j\) 使得 \(s_j = rk_j\),替换掉 \([\min(j,p),n]\) 之间的数的最大值即可。
删除一个点的时候可以直接暴力线段树分治,但是其实不需要这么做。只需要找最小的 \(j\) 使得 \(rk_j = s_j\) 然后找 \([1,\max(p+1,j)]\) 的最小值即可。
还没写。
T2,T3
还没看。

浙公网安备 33010602011771号