2024 山东省夏令营高算班【比赛】

D1T1 risk

题面

给定 \(n\) 个点 \(m\) 条边的无向图,起初每个点上都有一支军队,合并相邻两点上军队的代价为边权 \(w\),求将所有军队合并成一支的代价。

思路

不难发现合并的过程经过的边组成一个树,直接求最小生成树即可。

D1T2 magic

题面

\(n\) 个球,第 \(k\) 个球是特殊球。有 \(m\) 个操作,第 \(i\) 个操作交换 \(x_i\)\(y_i\) 位置的球。求对于所有的位置 \(i\),使得特殊球最终在位置 \(i\) 上而最少需要不进行的步数。

思路

\(dp_{i,j}\) 表示经过了 \(i\) 次操作,最后特殊球在 \(j\) 的位置的删除的最小步数,转移为 \(dp_{i+1,x}=\min(dp_{i,y},dp_{i,x+1})\)\(dp_{i+1,y}=\min(dp_{i,x},dp_{i,y+1})\)。注意到数组的第一维对答案没有影响,所以可以用滚动数组把第一维滚掉。

D1T3 letters

题面

给定两个字符串 \(A,B\),长度分别为 \(n,m\),都由 \(k\) 种不同的字符组成,但 \(B\) 字符串每种字符最多出现两次。定义字符串 \(A,B\) 的关联程度为 \(B\) 最多在 \(A\) 中不重叠出现了多少次。球所有满足条件的字符串 \(A,B\) 的关联程度之和,对 \(10^9+7\) 取模。

思路

border 的相关知识

定义:记字符串 \(s\) 长度为 \(i\) 的前缀为 \(pre(s,i)\),长度为 \(i\) 的后缀为 \(suf(s,i)\)。若 \(0\le r<|s|,pre(s,r)=suf(s,r)\),就称 \(pre(s,r)\)\(s\) 的 border。

\(H\) 小姐给出的字符串除了自己以外的 border 一定长度 \(\le \frac{m}{2}\) 且只有一个,反证法证明。

首先考虑 \(f\) 函数可以重叠时(\(g(A,B)\)),钦定 \(A\) 的一部分为 \(B\)

\(f\) 函数用容斥做。

求组合数用下降幂预处理。

然后就不会求了/cf

D2T1 luck

题面

思路

\(\Theta(n^3)\) 暴力。

记录 \(x,y\) 两天间的差异度为 \(d_{x,y}\)

若已知 \(d_{x,y}\),那么 \(d_{x+1,y+1}=d_{x,y}-[a_x\not= a_y]+[a_{x+l-1}\not= a_{y+l-1}]\)

所以只需先求出 \(d_{1,x}\),然后用 \(\Theta(1)\) 推广。

空间不够,先把所有的 \(k_i\) 标记出来,然后离散化处理。.

D2T2 traffic

题面

思路

暴力搜索 \(\Theta(n(n+m))\)

\(BFS\) 把最东侧出发到达不了的最西侧城市删掉。

考虑平面图的性质,一个点可以到达东侧的城市都是一段连续的区间。

证明:对于城市 \(A\),设能到达的最东侧城市中纵坐标最小和最大的分别是 \(l,r\),则 \([l,r]\) 中的一点 \(b\) 一定能从 \(a\) 走到,反证法。

把东侧城市从小到大分别为起点 \(BFS\),已经搜过的点不再搜索,搜到之前没搜过的节点 \(l\) 就是本次 \(BFS\) 的起点,求 \(r\) 同理。

T3 tree

题面

思路

特殊性质 A

树高只有 \(\Theta(\log n)\) 级别,即 \(\sum\limits_{i=1}^n siz_i\)\(\Theta(n\log n)\) 的级别。

晚上再补

T4 path

link

暴力 \(dp\) \(\Theta(nm)\)

然后就不会了。

D3T1

简化版

求两个方阵的最大子方阵的边长。

思路

暴力 \(\Theta(n^7)\)

二维哈希,\(\Theta(n^5)\)

对于一个相同的边长,共有 \(\Theta(n^2)\) 个子矩阵,将 \(A\) 矩阵的 \(hash\)\(\Theta(n^2)\) 插入,\(B\) 矩阵 \(\Theta(1)\) 查询,总复杂度 \(\Theta(n^3)\)

最后注意到公共子矩阵的边长具有单调性,可以将美剧子矩阵编程改为二分边长,时间复杂度 \(\Theta(n^2 \log n)\)

D3T2

简化版

思路

\(k=0\) 时最长上升子序列模板。

\(k=1\) 维护 \(f_0,f_1\)\(f_x(i)\) 表示当前改变 \(x\) 次后长为 \(i\) 的 LIS 的最后一个元素的最小值。同时维护 \(f_0\) 的更新对 \(f_1\) 的贡献,即 \(f_1\) 对更新后的 \(f_0\) 求出改变一个元素拼接后的长度取最大值。时间复杂度 \(\Theta(n \log n)\)

\(k=1\) 的做法扩展到 \(k\le 20\)。维护 \(k+1\) 个数组 \(f\),不仅进行二分操作,同时维护来自上一级的更新。若 \(i<j\)\(f_i\) 的更新在 \((j-i)\) 轮后会影响到 \(f_j\),故美剧序列中的一个位置时,\(f_x\) 需要维护来自上一级的 \(x\) 个更新,所以单次共需维护 \(\Theta(k^2)\) 次更新,根据 \(x\) 降序进行更新可以满足无后效性。总时间复杂度为 \(\Theta(kn\log n+k^2n)\)

D3T3

原题

思路

对于区间 \([l,r]\)\(r\) 点必须设置一个岗哨,从右向左遍历,若此点未设置岗哨,则设置岗哨并更新它左边有哪些点能够被监视,暴力 \(\Theta(n^4)\)

考虑固定右端点 \(r\),倒序枚举左端点 \(l\),记录 \([l+1,r]\)\(r\) 能监视到的下标最小的点 \(p\),那么 \(p\) 点就可以视为分割线,\([l+1,p-1]\)\([p+1,r-1]\) 是互相不可见的,所以两边互不影响。此时若 \(r\) 看不见 \(l\),则 \(f(l,r)=\min(f(l,p),f(l,p-1))+f(p,r)\);若 \(r\) 能看见 \(l\),则 \(f(l,r)=\min(f(l+1,p),f(l+1,p-1))\),并将 \(p\) 更新为 \(l\)

\(r\) 能跨过 \(p\) 监视 \(l\) 的充要条件是 \(\frac{h_r-h_l}{r-l}>\frac{h_r-h_p}{r-p}\),时间复杂度为 \(O(n^2)\)

D3T4

原题

思路

当没有操作 \(1\) 时,操作 \(2\) 会使值域 \(V\) 缩小到 \(\log V\),所以一个数进行 \(O(\log^* n)\) 次操作就会 \(\le 1\),因此可以用线段树维护,若一个区间内元素全部 \(\le 1\) 就打赏标记。暴力递归,不进入打上标记的子树,时间复杂度 \(O(q\log n)\)

当有操作 \(1\) 时,加法操作会打破势能。注意到当进行一次操作 \(2\) 后,整个区间的值域都会变为 \(O(\log V)\),使用线段树维护,发现最后一次求 popcount 后,无论进行多少次操作,都可以表示为 \(popcount(sth)+b\),考虑维护标记:\(f(popcount(x+a))+b\)

其中 \(f(x)\) 为定义域和值域均为 \(O(\log V)\) 的映射,修改序列可以看作若干 \(popcount(x+b)\) 的复合,值域为 \(O(\log V)\),从第二次开始定义域为 \(O(\log V)\)。我们可以计算第一次时的函数的样子,从第二次开始暴力进行函数复合,最后加法单独计算即可。

由于值域不同,单纯的加法需要单独记录,处理时记录当前区间是否有求 popcount 即可,总时间复杂度为 \(\Theta(q\log n\log V)\)

D4T1

[ARC148A] mod M

思路

答案非 \(1\)\(2\),当 \(%2\) 时即可得到答案。

考虑答案为 \(1\) 时,所有的 \(a_i\) 都对 \(m\) 同余,即所有的 \(a_i\) 都可以写成 \(k_i x+b\) 的形式,差分将 \(b\) 消掉,即可得出结论:若整个数列的差分数组的 \(\gcd\)\(1\),则答案为 \(1\);否则答案为 \(2\)

D4T2

CF1594F Ideal Farm

思路

一种分配方式相当于有 \(s\) 个球,\(1\) 的左边和 \(s\) 的右边各有一个挡板,再向中间 \(s-1\) 个空隙中插入 \(n-1\) 个挡板。而一种不可被攻下的分配方式满足挡板两两之间距离不为 \(k\)。尝试构造这样一组分配方式。

发现模 \(k\) 不同余的空隙互不影响,所以只把模 \(k\) 同余的空隙单独拎出。设这样的一组中的空隙共有 \(x\) 个,发现为满足条件挡板必须两两不相邻,因此最多放下 \(\lceil \frac{x}{2} \rceil\) 个挡板。依据此判定即可。

D4T3

P8089 『JROI-5』Color

思路

首先考虑满二叉树,设 \(dp_i\) 表示层数为 \(i\) 的满二叉树的方案数。不难推出 \(dp_i=(dp_{i-1}+1)^2\)。筛出来备用,并愉快地得到 \(20\) 分。

接下来考虑正常情况。考虑我们在树上从根开始移动,从高到低枚举枚举 \(s\) 的每一位,如果该位为 \(1\),则证明所在位置的左子树是一颗满二叉树,其方案数已被预处理,我们进入右子树。如果该位为 \(0\),则证明所在位置没有右子树,我们进入左子树继续计算即可。

总时间复杂度 \(\Theta(Td)\)

D5T1

题面

给定 \(a,b\) 数组,每次可以交换 \(a\) 数组中的两个数,求 \(\sum\limits_{i=1}^n (a_i-b_i)^2\) 的最小值和达到此值的最小操作次数。

思路

把两个序列都升序排列就可以得到最小距离。

把序列 \(a\) 的元素替换为它对应的元素在 \(b\) 中的位置。把排列拆成若干个循环,总的交换次数为元素的个数 \(-\) 环的个数。

D5T2

CF1580C Train Maintenance

思路

很典的根号分治板子,总复杂度为 \(\Theta(nB+\frac{n^2}{B})\)

D6T1

被 hack 了,没艹过去/cf

原:20th POI, Stage 3, Gdzie jest jedynka?

二分寻找和任意一个数差值最大的数,然后再从这个数开始找和它差能被 \(n-1\) 整除的,可以得到 \(1,n\),时间复杂度 \(\Theta(n\log n)\)

D6T2

AMPPZ 2019 H. Cheese Game

简单 DP,每个 \(i\)\(i-2\)\(i-3\) 转移而来。

D6T3

25th POI, Stage 2, Tomik poezji

首先删掉所有 \(\mod s=0\) 的数,若出现次数最大的数出现次数不超过一半,则答案为 \(0\)

证明:我们不断尝试放出现次数最大的数,除非这会产生 \(s-1\),此时可以选剩下任意一个数,并且选完了之后又可以选出现次数最大的数。

D6T4

原:BZOJ 3103 Palindromic Equivalence

Manacher。

posted @ 2024-07-25 15:13  CheZiHe929  阅读(26)  评论(0编辑  收藏  举报