2026 山东一轮省集
Day 0
\(100 + 0 + 0\)。
T1
边集是好的当且仅当其构成基环树(也可以是树)构成的森林。
如果确定了保留哪些边,就有如下的贪心可以让我们获得权值和最大的边集:
从大到小加边,如果一条边连接的两个点都属于一个基环树(可以是同一棵,也可以不是),那么这条边就不能被加入,否则一定被加入。
考虑对每条边分别计算其被统计到答案里面的方案数,对于比这条边权值小(权值相同也钦定一个顺序)的边对方案数没有影响,直接乘上一个 \(2\) 的整次幂。
如果这条边连接了 \(x,y\),那么这条边不能被加入当且仅当 \(x\) 和 \(y\) 都属于一棵基环树。设 \(f_S\) 为考虑前若干大的边,\(S\) 集合可以形成一整棵基环树的方案数。也就是联通并且边数 \(> n-1\),也就是联通的方案数减去加入的边恰好形成一棵树的方案数。这两个都是可以随着边的加入而更新的。
对于联通的个数 \(g_S\),加入新边 \(\{x,y\}\) 的时候,有 \(g_S = 2g_S + \sum\limits_{x\in T \subseteq S,y \in (S \setminus T)} g_T g_{S\setminus T}\)。(和后者相比即已经联通的图可以继续加边)。
对于树的个数 \(h_S\),加入新边 \(\{x,y\}\) 的时候,有 \(h_S = h_S + \sum\limits_{x\in T \subseteq S,y \in (S \setminus T)} h_T h_{S\setminus T}\)。
\(f_S = g_S - h_S\),不能加入这条边的方案数就是 \(\sum\limits_{x \in S,y \in T,S \cap T = \emptyset}f_S f_T + \sum\limits_{x,y \in S} f_S\)。
以上所有转移时间复杂度 \(O(3^n)\),每条边都做一遍即 \(O(m 3^n)\)。用子集卷积可能可以优化到 \(O(m n^2 2^n)\),没仔细想。
T2,T3
不会。
Day 1
\(15 + 20 + 20\) 爆干净了。
T1
题意:给你十个图灵机(基本都是 \(7\) 状态的),判断是否停机。其中恰好 \(5\) 个停机。
这个真的不是题。
大概做法就是你发现这些图灵机都是有一些周期性的(画出形状是一个又一个的钟形),然后你多找几层规律然后暴力模拟。看哪几个跑出来了。
更好的做法是利用 IOI 赛制,直接一个一个试,但是手速不够快的话就不好了,开赛一会这个题的提交就被 ban 掉了。
当然你也可以和通过的同学交流一下获得答案,比写个程序跑现实多了。
T2
?!TB5?!
T3
类似 Souvenirs。
先回顾一下那个题的做法:对值域序列分治。
当我们考虑距离 \(mid\) 为 \(x\) 的左端点的时候,我们只需考虑距离 \(mid\) 小于 \(x\) 的位置作为右端点,这样我们正反做两次就可以覆盖所有点对。发现在这些点中选左端点在原序列位置的前驱后继足以支配其他点对。因为右半部分端点两两之间大小之差都 \(\le\) 左端点和他们的距离。支配对总数是 \(O(n\log n)\) 的。
对于这个题来讲,我们只需要再找前驱后继的时候多找一个,也就是向前向后个找两个就可以了。考虑左端点 \(a\),右端点 \(b,c\),如果 \(a,b\) 颜色不同并且 \(a,c\) 颜色不同,那么 \(b,c\) 颜色一定相同。
找到所有点对之后,用 KD-Tree 直接维护,复杂度 \(O(n \log^2 n + m\sqrt{n \log n})\)。
Day 2
\(90 + 20 + 28\),无人过题。
T1
一段区间的代价就是括号匹配数,这是一个确定的值,\(c_i\) 的分配可以直接使用组合数计算,我们要做的就是计算有多少种括号匹配的方式。
直接从左往右贪心是错误的,例如 ()),第一个右括号不必匹配。
化成折线,以最低点为界,左边的左括号,右边的右括号必须匹配,因此两边分别扫一遍贪心就行了。
因为扫的起点是最小值,多组询问的时候,将询问挂在笛卡尔树上面暴力求答案。复杂度是笛卡尔树每个点的深度和,随机折线这个值是 \(O(n\sqrt n)\),我不会证明。此时时间复杂度 \(O(n \sqrt n + q)\)。
这很不平衡,正解是通过分块做到了 \(O(n^{0.75}q^{0.5})\),但是有更简单的做法:发现我们要做的只有求区间乘积,参与运算的还是折线高度,这个东西变化只有 \(+1/-1\),天然可以四毛子,通过四毛子加速可以做到 \(O(\frac{n\sqrt n}{B} + qB + 2^B\sqrt{n} )\)。设 \(B = 8\) 跑得很快。
T2
T3
容斥,钦定一个集合为 border,那么对答案的容斥系数是 \(\prod(w_i - 1)\)。
怎么算满足条件的串的个数?
设当前钦定的最大的两个 border 是 \(a>b\),若 \(a \geq 2b\) 则给答案乘上 \(m^{2a-b}\) 并删掉 \(a\)。否则加入 \(2b-a\) 后删掉 \(a\)。
直接搜索并模拟上述过程,记录当前那些 border 被额外加入,如果说钦定的 \(a\) 已经被额外加入过,那么容斥系数是 \(w_a\) 而非 \(w_a - 1\),因为此时 \(a\) 钦不钦定都可以。
继续剪枝。额外加入的 border 中,如果存在 \(a>b>c\) 使得 \(b+c+\gcd(a-b,a-c) \geq a\),即 \(a-b+a-c-\gcd(a-b,a-c) \leq a\),也就是周期引理,那么就可以把 \(b,c\) 删去,加入 \(a-\gcd(a-b,a-c)\)。这样就减小了集合大小。加入额外限制之后重构整个数组,从小到大加入,如果前三大满足这个条件就可以执行上面的约减操作。这样好像可以把集合变得特别小。直接哈希记忆化搜索可以获得很高的分数。
用类似 trie 的结构代替哈希表可以减小常数。
我没有写代码。
\(n = 800\) 居然可以非多项式复杂度,受教了。
Day 3
\(100 + 30 + 30\),T2 没时间了。
T1
对每个人求一个线性基。
从右往左扫,最右边的人可以控制他线性基中的所有最高位。第二个人的所有值中,比如 \(S_i\) 控制的最高位 \(i\) 已经被前人控制了,那么 \(S_i\) 就需要异或上这个值继续往下走,发现这个东西就是线性基的插入过程!直接维护区间线性基即可。
知道了区间线性基我们就可以知道每个位被哪个人控制。从高到低遍历每一位,如果这一位和控制这一位的 \(i\) 的 \(a_i\) 的这一位不同,就异或一下。这样就求出答案了。
时间复杂度 \(O(n\log V)\)。
T2
先把格点都去重。
对角线上没有点的话,按照对角线分成的四个部分是互不影响的。每个部分我们可以 DP 解决:三角形的边界是一条折线,且这条折线的高度是 \(O(\sqrt{n})\) 的,因为超过这个高度就不如直接单选所有点。DP 过程中计算贡献是容易的。
算上对角线的时候,发现对于 \(4\) 条对角线,每条对角线最多会被一边的等腰三角形覆盖。直接 \(2^4\) 分讨就可以了。
如果存在正中心的点,分讨他被哪个等腰三角形覆盖就行。
时间复杂度 \(O(n\sqrt{n})\),看起来很麻烦。
T3
直接看洛谷题解好了。
Day 4
\(100 + 100 + 0\)。
T1
前两题都是数论。
询问怎么做?
设 \(p\) 的原根为 \(g\),那么 \(a_i\) 都可以表示为 \(g\) 的若干次方。\(g^{p-1} = 1\)。
这些数相乘就是指数模 \(p - 1\) 意义下相加。设 \(a_i = g^{b_i}\),答案就是 \(\dfrac{p-1}{\gcd(b_1,b_2,\cdots,b_n,p-1)}\)。
离散对数并不好求,但是发现 \(b_i\) 无论如何都要和 \(p-1\) 做 \(\gcd\),考虑直接求出 \(\gcd(b_i,p-1)\),设 \(c_i\) 是 \(a_i\) 的阶,有 \(\dfrac{p-1}{c_i} = \gcd(b_i,p-1)\),阶是可以 \(O(\log p)\) 求的。用线段树维护区间 \(\dfrac{p-1}{c_i}\) 的 \(\gcd\) 就行。
区间修改怎么做?考虑做差分,设 \(d_i = \dfrac{a_i}{a_{i-1}}\),那么 \(a_l \cdots a_r\) 的答案就是 \(a_l ,d_l+1,\cdots d_r\) 的答案。查询时只需查询一个位置的 \(a\)。修改只需修改两个位置的 \(d\),都可以直接维护。
T2
容斥,\(\gcd > B\) 和 \(\operatorname{lcm} < A\) 都是容易计算的。现在只需计算 \(\gcd > B \land \operatorname{lcm} < A\) 的方案数就可以算出问题的答案。
若数组的 \(\gcd\) 为 \(L\),\(\operatorname{lcm}\) 为 \(R\),则能产生贡献的 \((L,R)\) 对只有 \(O(n\log n)\) 个。设 \(T = R/L\),那就是询问值域 \([1,T]\),\(\gcd = 1 \land \operatorname{lcm} = T\) 的 \(n\) 项序列有多少个。
枚举 \(T\) 的每个质因数 \(p_i\),相当于每个质因数出现次数有 \(0\) 也有 \(\alpha_i\)。容易容斥分别计算,将每个质因数的答案乘起来即可。
一次询问相当于矩形数点,离线树状数组就做完了。
T3
重要的转化就是将每列的字符串插入 \(\text{Trie}\),那么每一层到下一层的变化中,第一次变化必须是 \(0 \rightarrow 01\) 或 \(0 \rightarrow 1\)。
这样就完全和题目中的条件符合了!我们只需要对着这个结构计数就行了。设 \(f_{i,l,r,0/1/2}\) 表示长度为 \(l\) 的任意字符串,经过 \(i\) 次操作变成 \(r\),并且第一次操作是将第一个位置变成 \(0/1/01\),后面的位随意变(第一次操作不考虑前面的限制)的方案数。转移不困难,可以参考洛谷题解。
Day 5
\(100 + 76 + 40\)。
T1
八天中最简单的一题。
每行涂黑的一定是一个区间。
设 \(f_{i,j,k}\) 表示第 \(i\) 行,此时区间长度为 \(j\),答案能否是 \(k\)。直接转移是容易的。时间复杂度 \(O(\dfrac{n^4}{w})\)。
T2
先找性质:
- 操作可逆。
- 随便设一个初状态,此时如果一个状态可以被到达,根据可逆性,这个状态也一定可以作为初状态。
先考虑树怎么做。
确定一个点为根,每条边的船停在父亲处。此时只要任意点都能到根,根据可逆性,任意点都能到人任意点。
此时我们以权值最大的点为根,发现此时满足任一点都能到达根。且这个状态是可以被到达的,那么这个状态的权值和就是答案,即 \(\sum\limits_{i=1}^n{a_i * (deg_i-1)} + \max a_i\)。
对于图来说,发现保留一个生成树是最好的,有一个环不如删掉一条边。
也就是设边 \((x,y)\) 的权值是 \(a_x + a_y\),求最小生成树。
\(q > 0\) 的时候,即加入一些边使得最小生成树最小。对于任意已经存在的边,删掉他的收益是原边权减去断开后两个连通块的最小权值之和,这之中必有一个全局最小值,也就是新连的边必然有一个端点是 \(a_i\) 最小的那个点。
这样看可以证明贪心断收益最大的边是正确的。暴力维护做到 \(O(nq)\)。
优化考虑树的最终形态是一个以最小值为根的菊花,倒过来做,每次连一条新边 \((x,y)\)(这条边要在原树中出现),断开 \(x,y\) 所在两个子树的根中权值较小的那一个,找一条增加的权值最小的边连上即可。可以每个子树维护一个堆求出和其他子树的连边中权值最小的那一条,在总体维护一个堆来确定每次操作的边。合并两个连通块使用启发式合并,使用延迟删除的技巧,如果堆顶的边两端已经在一个连通块中就删去堆顶。这题就做完了,时间复杂度 \(O(n \log ^2n)\),用可并堆维护可以做到 \(O(n\log n)\)。
T3
完全没见过类似题目。
先容斥,\(S_i = 1\) 那么认为其可以走任意边,\(S_i = 0\) 认为其只能走 \(0\) 边。求完了这个答案之后再 IFWT 即可。
发现 \(S\) 的答案只和其 \(0\) 的连续段长度构成的可重集有关。因为 \(1\) 可以看做是任意移动,这样连续段之间根本没有影响。例如 \(S = 01010001\),那么连续段长度集合为 \({1,2,2,4}\)(\(0\) 的长度 \(+1\),即点数)。
这样状态数只有分拆数 \(P(n)\) 级别。\(P(19) = 490\)。
设 \(g_{S}\) 遍历点集 \(S\) 的路径数量。那么对于一个分拆相当于 \(g\) 做无交并卷积,直接在 DFS 的过程中乘就可以了,复杂度是 \(O(2^n(P(n)+ n^2))\)。
Day 6
\(100 + 55 + 44\),我不会数据结构啊。
T1
求出只保留后缀 \(i\) 的时候,\(i\) 最远可以吃到 \(R_i\)(即可以从 \([i:n]\) 吃到 \(\{i\} \cup [R_i:n]\)),从右往左扫,\(i\) 要连的后继就是 \([i,R_i)\) 中字典序最小的那个串。可以倍增哈希做到 \(O(\log n)\) 一次比较,维护单调栈,在栈上二分出最后一个位置 \(< R_i\) 的串继承就行。这题就做完了。
其实求 \(R_i\) 的过程和求答案的过程都是维护了同一个单调栈。这两者可以合并,感觉不是很重要,细节可以参考原题题解。
T2
我贴的那一个题和这个题题面不同,但是我是看那个题题解会的这个题。
对于一对颜色的有序对 \((x,y)(x\neq y)\),称这一对元素的贡献为:将 \(a_i = x\) 的 \(b_i\) 设为 \(-1\),\(a_i = y\) 的 \(b_i\) 设为 \(1\),求一个至少含有一个 \(-1\) 的最大子段和。
题目要求的就是所有颜色对之间的贡献的最大值。
求众数基本上复杂度肯定带根号。考虑每个颜色,对出现次数大小分治。称出现次数 \(> B\) 的为大颜色,否则为小颜色。
求一对颜色的贡献,因为只需要求最大子段和,所以颜色的出现压缩成游程编码一类的东西也能计算。时间复杂度为两种颜色出现次数的最小值。
对于一个大颜色,可以直接暴力求他和其他所有颜色的贡献,每种颜色时间复杂度 \(O(n)\),总的复杂度就是 \(O(\dfrac{n^2}{B})\)。
当一个小颜色作为众数的时候,答案肯定不大于 \(B\)。枚举每一个可能成为答案的子区间(显然区间两端都是这种颜色的时候才最优,一共只有 \(O(n\sqrt n)\) 个),预处理对于每个左端点和 \(k \le B\),最小的右端点使得这段区间出现最少的颜色 \(\ge k\)(没出现视作出现一次),再维护一个当前答案 \(ans\),每次只要暴力 check 当前区间能否让 \(ans + 1\) 即可,\(ans\) 至多有 \(B\),因此预处理的 \(k\) 也只需要到 \(B\),时间复杂度 \(O(nB)\),平衡做到 \(O(n\sqrt n)\)。
T3
其实这道题是原创题。
还没学会。
Day 7
\(100 + 100 + 55\),T3 数据略水。
T1
不修改怎么做?
把所有数放到 Trie 上面,对于一个节点,如果它子树内所有数又是同一个颜色称其是纯色的,否则是杂色的。
如果一个节点的左儿子或右儿子之一是杂色的,那么左右儿子之间的贡献就没有用了。因为左右儿子之间的异或在当前这一位是 \(1\),而左右儿子内部在这一位是 \(0\),因为至少有一个是杂色,所以内部的贡献一定存在。
否则左右儿子都是纯色,只有这个时候她才会对总答案产生贡献。这个节点对答案的贡献可以暴力计算,每个数最多被暴力计算 \(O(\log V)\) 次,因此时间复杂度 \(O(n\log ^2 V)\)。
修改颜色怎么做?发现因为权值不会修改,暴力计算产生的贡献是确定的,因此对每个节点预处理对他的子树暴力计算的答案,修改颜色的时候直接 PushUp 就可以了。
T2
不存在 \(i < j < k\) 且 \(a_i \ge a_j \ge a_k\) 说明原序列是两个 \(1 \sim n\) 的序列的归并,对于一种数,将他第一次出现视作 \(+1\),第二次出现视作 \(-1\),这样的序列就和 \(y\) 坐标 \(\ge 0\) 的折线形成了一一对应。
分讨和推理,发现「只要 \(a_i, a_{i+1}, a_{i+2}\) 形成等差数列,则 \(i\) 和 \(i+1\) 必须至少有一个是完美点。」就是说不能有连续三个 \(+1/ -1\),「存在恰好 \(r\) 个 \(a_i \ge a_{i+1}\)」是说 \(+1\) 后面刚好是 \(-1\) 的结构恰好有 \(r\) 个。
结合上面所有,原问题被转化成了计算满足如下条件的折线数量:
- 起点为 \((0,0)\),终点为 \((n,n)\)。
- 满足 \(x \le y\)。
- 一共走 \(r\) 步,设当前在 \((x,y)\),下一步可以走到 \((x+1,y+1),(x+2,y+1),(x+1,y+2),(x+2,y+2)\) 四种之一。
枚举 \((x+1,y+2)\) 的数量为 \(i\),其余三种的数量都可以用 \(i\) 表示。\((x+1,y+1),(x+2,y+2)\) 不影响 \(x \le y\) 的条件,可以直接组合数计算,其余两种之间的方案数是卡特兰数 \(H_i\),总之算方案是容易的,再化一化式子就发现可以范德蒙德卷积,就能 \(O(1)\) 计算了。
T3
做法出人意料的简单,但是感觉想不大到。
对于一种颜色,最终只看这种颜色的边的话,肯定是一组匹配,所以 \(m+1\) 是奇数肯定无解。
设一种颜色 \(i\) 的权值 \(c_i\) 是当前只考虑颜色 \(i\) 的边,没有匹配的点的个数,显然如果 \(c_i > m+1-n\) 这个颜色就没救了,也就是无解,否则一定有解,我们归纳构造:
加入一个新的点之后,考虑他和前面所有点的连边,建出一个二分图,左部点是 \(m\) 种颜色,右部点是要连的 \(n\) 条边,如果第 \(i\) 条边可以染第 \(j\) 个颜色,那么就连边。有一些颜色的 \(c\) 是顶了限制的,就是如果这次没有边染这个颜色,那他就没救了,顶限制的颜色必须匹配。我们让不顶限制的颜色连一个垃圾桶点,这个点的流量是 \(m-n\),这样如果最大匹配是 \(m\),就说明可以加一个新点并保持合法。观察这张图发现每个右部点的度数是一样的。这是一张正则二分图,一定能完美匹配(不会证)
。于是这个题就做完了。
Day 8
\(100 + 53 + 28\),啥也不会了。
T1
有点恶心。
两个数组能互相变的充要条件是:对于任意 \(1 \le i < n\),\([pos_i < pos_{i+1}]\) 都是一样的。
对于每个数分别求出所有情况他贡献的逆序对总和,暴力乱 DP 就可以做到 \(O(n^5)\)。
前缀和/差分优化一下就能 \(O(n^4)\)。
T2
考虑没有环,设 \(f_{i,j}\) 是 \(i\) 到 \(i+1\) 这条路径上有 \(j\) 个单位的东西经过(\(j\) 可以是负数),前面都合法的代价,有转移方程:
这个东西可以用 slope trick 优化:取 \(\min\) 的部分区间长度是确定的,相当于扩大底部平台,加绝对值就不用多说了。
有环怎么做?原问题可以转化为费用流(没想过),反正答案关于 \(1\) 到 \(n\) 之间的流量是凸的,可以三分/二分斜率。
T3
设 \(n>m\)。
设 \(f_i\) 是长度为 \(i\) 的数组,每个数互不相同,且异或和是 \(0\) 的方案数,有转移方程:
意思就是前 \(i-1\) 个随意时,第 \(i\) 个时前 \(i-1\) 个的异或和,减去第 \(i\) 个和前面某个数相同的情况。
对于原问题,\(f_{n+m}\) 一定是答案的子集,否则两个数组间会形成一些匹配,对于位置相同的两个元素不能匹配,这也就是错排。此时答案就是:
其中 \(D(n,i)\) 是长度为 \(n\) 的排列,前 \(i\) 个构成错排的方案数。我们要求一行这个东西,怎么做呢?
先考虑 \(D(n,n)\) 的求法,有经典式子 \(D(n,n) = (n-1)(D(n-1,n-1)+D(n-2,n-2))\)。
在寻找一些关于 \(D(n,i)\) 的关系式:
-
考虑第 \(i+1\) 个元素,分讨他是否构成错排,有 \(D(n,i) = D(n,i+1) + D(n-1,i)\)。
-
分讨第 \(i\) 个元素匹配了前 \(i-1\) 个还是后 \(n-i\) 个,有 \(D(n,i) = (n-i)D(n-1,i-1)+(i-1)D(n-1,i-2)\)。
有了这两个关系,再结合线性推出的 \(D(n-1,n-1)\) 和 \(D(n,n)\),可以线性求出所有的 \(D(n-1,*)\) 和 \(D(n,*)\)。
设现在知道 \(D(n-1,i)\) 和 \(D(n,i+1)\),可以通过第二个关系式求出 \(D(n-1,i-1)\),再通过第一个关系式求出 \(D(n,i)\),这样就可以不断递推下去了。

浙公网安备 33010602011771号