2024联训第一周题目讲解

写的东西不一定都讲了。

F - Night of Full Moon

暴力模拟即可。

好像大家不会算复杂度。

D - 约瑟夫问题

oiwiki https://oi-wiki.org/misc/josephus/

其中大家需要理解记住对数做法中的复杂度的计算。

H - 燃烧权杖

搜索能过。

这差不多是某多校原题,我们来思考数据范围更大时:

发现卡牌释放在随从身上时,是无关紧要的。所以我们完全可以忽略随从的存在。只有英雄 \(x\),和英雄 \(y\)

那么 \(x\) 需要打 \(\lceil \frac{x}{10}\rceil\)\(y\) 同理。

换句话说,我一直释放卡牌,要么打在 \(x\) 上,要么打在 \(y\) 上。当 \(x\) 被打 \(a\) 次时或者 \(y\) 被打 \(b\) 次时停止。

随机

考虑随机生成若干次结果,当随机的足够多,那么它就会接近正确答案。

组合数学

假设 \(x\) 赢了,且一共就行了 \(k\) 轮,那么有 \(b\le k < a + b\),所以它赢的概率为 \(\sum_{k = b}^{a + b - 1}(\frac 1 2) ^ kC_{k - 1}^{\ b - 1}\)

C - L的拼图

一道简单的搜索题,但不太好写。

hack 数据:

3 4
1110
1011
1110
No

3 6
011110
110011
011110
No

2 13
1110111011111
1111111111111
No

7 3
010
111
111
010
111
111
010
No

4 5
00011
11011
11110
00110
No

5 7
0111010
1111111
1000001
1111111
0111010
No

二维状态的表示:

难写的地方主要在二维状态的表示上和枚举上,对此我们可以采用以下方案:

1.直接用二维数组来表示。用 01 来表示该位置是否被占。在这道题中,枚举的时候就可以先选一个没被占的格子,再枚举它周围的各种,看看他们能否组成 L 形。

2.对每个格子编号。那么在这道题中,枚举三个格子判断他们是否能组成 L,然后再下一步。

一些优化:

无论我们采用 1 或者 2,都很容易发现每个 L 形内部的三个格子的枚举顺序是无关的,所以我们尽可能的让同一个 L 形不被枚举多次。那么针对方案 2,我们可以再枚举时强制要求枚举的三个格子的编号是递增的。

同理:不同 L 形之间的顺序于是无关的。 以我们尽可能的让同几个相同 L 形的组合不被枚举多次。那么针对方案 2,我们可以再枚举时强制要求枚举的每个 L 所包含的最小编号是递增的。

总结:在某些划分型的搜索题中,我们可以通过限定每个划分内的顺序和每个划分间的顺序来降低复杂度。那么我们往往采用对 xx 就行编号,并要求划分内和划分间的编号递增。

eg:https://www.luogu.com.cn/problem/P1120(洛谷小木棍)尝试用上述方法对其优化。(有空就讲)

G - 建筑大师

常用剪枝技巧

假设我从底向上枚举,记最底层为第 \(1\) 层。

上下界剪枝:根据已有的一些信息,找出当前枚举的上下界。

从可行性上:按照当前的状态搜索一定搜不出合法的解,剪掉。

当前枚举第 \(i\) 层,已用体积为 \(s\)

a.因为 \(l_i\) 是递减的,那么 \(l_i \le l_{i - 1}\)

b.因为 \(H_i\) 是递减的,那么 \(H_i \le H_{i - 1}\)

c.因为 \(l_i\) 是递减的,那么从 \(i+1\)\(M\) 层,至少需要边长 \(1, 2, \dots M - i\),所以 \(l_i> M - i\)

d.因为 \(H_i\) 是递减的,那么从 \(i+1\)\(M\) 层,至少需要高度 \(1, 2, \dots M - i\),所以 \(H_i> M - i\)

e.因为总面积为 \(N\),又因为 c. 和 d. 那么 \(i\to M\) 至少消耗体积 \(1^3 + 2^3 \dots + (M - i)^3 = f(i)\)。所以 \(l_i*l_i *H_i \le N - s - f(i)\)

这样一下子就剪掉了大量的非法状态。

从最优性上:按照当前的状态搜索,搜出的解一定劣与已知最优解,剪掉。

差不多就是 A*。

估价函数 g():从当前状态到结束状态,估价的大概的所需的”路程“。当然我们不可能计算出精确的“路程”,但它必须比真实的“路程”小,或者说找一个下界。

当前枚举第 \(i\) 层。已用表面积(包含顶部) \(b\),已知最优解 \(ans\)

a. 以为顶部已经包含了,底部不算,所以剩下的每份体积至少构成 $1^3 + 2^3 \dots $ 的模样,所以他们至少产生 \(4*1^2 + 4 * 2^2+4*3^2\dots = g(i)\) 的表面积,换句话说按着当前的方法至少还需要 \(g()\) 的表面积,如果 \(g(i) + b >= ans\)。那么一定不会产生最优解,直接返回。

b. 如果要用 \(i\) 层,消耗 \(M - s\) 的体积,那么它产生的面积,一定大于等于消耗同样体积,只用 \(1\) 层。所以计算下只用一层产生的最小面积 \(g(M - s)\),然后与上同理。

B - 心电感应

条件的恒等变形:

我们这里不考虑询问。

在题目中,我们常常会遇到一些比较数学的条件如:\(a_i - a_j = i - j\),并且它是一个两边与都 \(i,j\) 有关的条件。我们可以尝试对其变形,尽量让等式的两边各自独立:\(a_i - i = a_j - j\),这样使得左边只与 \(i\) 有关,右边只与 \(j\) 有关。从而化简问题。

eg:\(a_i - a_j = i - j + 1\)

与上一样 \(a_i - i = a_j - j + 1\)。同样我们统计每个 \(a_i - i = m\) 的数量,将 \(m\) 的数量和 \(m + 1\) 的数量乘起来。

eg:\(|a_i - a_j| = |i - j|\)

\(a_i - a_j = \pm (i - j)\)。那直接分两类讨论即可。

eg:\(a_i - a_j > i - j\)

同原题,做前缀和处理。

eg:\(\frac{a_i + 1}{a_j - k} > \frac{i}{a_j -k}\)

\(a_i - i + 1 > a_j -k\)。先考虑统计 \(a_j - k = m\) 的数量,假设叫 \(F[m]\)。因为 \(k\) 是连续的 \(1\to n\)。所以相当于统计 \(1\le a_j - m\le n\)\(1 + m \le a_j \le n + m\) 的数量。用前缀和轻松搞定。

那么现在对于每个 \(a_i - i + 1\),满足 \(a_i - i + 1 > a_j -k\) 的即为 \(\sum_{m<a_i - i + 1} F[m]\)。同样使用前缀和。

最后别忘了把 \(a_j -k = 0\) 去除。

同样我们也可以变形为 \(a_i - i +k > a_j - 1\)。自行尝试分析。

A - 报告教练,我玩原神

task1:经典思路

\(\sum_{l}^r a_i = 0\)

step1:问满足 xxx 的区间,往往考虑枚举右端点r,计算该右端点有多少符合要求的左端点。并将条件转化为较为简单的等式关系。

根据前缀和,显然如果 \(l\) 符合要求,那么 \(sum[l - 1] = sum[r]\)

step2:统计某等式内容出现的数量,一边枚举 r, 一边更新出现次数。再根据统计的信息计算左端点。

\(x = sum[]\) 开个桶,那么即为 \(sum[r]\) 的出现次数,即 \(bucket[sum[r]]\)

step3:对桶的更新和计算可以需要一些复杂数据结构或者转化。

这题比较简单:更新直接 \(bucket[sum[r]] ++\)。计算直接就是 \(bucket[sum[r]]\)

eg.\(\sum_{l}^r a_i \not= 0\)

step1:\(sum[l - 1]\not = sum[r]\)

step2:桶中除了 \(bucket[sum[r]]\) 的和,即为 \(n - bucket[sum[r]]\)

step3:无。

eg.小写字符串串。问区间里 'a' 的数量的奇偶性和 'b' 的数量的奇偶性不同。

step1:\(s[0/1][0/1]\) 表示前缀里 ’a' 为奇(或偶)且 ’b' 为奇(或偶)的数量。

step2:简单分类讨论。

step3:无。

eg.给定 \(k\)\(a_i\) 有正有负,区间平均值大于 \(k\)

step1:\(sum[r] - k*r\ge sum[l - 1] - k*(l - 1)\)

step2:对 \(sum[i] - k*i\) 开桶,即为 \(\sum_{i \le sum{[r]-k*r}}bucket[i]\)

step3:相当于对桶做单点修改,区间求和,需要一些数据结构来维护。

task2:难度其实较大,比较思维题。但是有两个点是值得大家思考的

左端点的分界点

同样我们考虑枚举 \(r\)

如果 \([l \ r]\) 是合法的那么 \([l + 1\ r]\) 也一定是合法的。

如果 \([l \ r]\) 是非法的那么 \([l - 1\ r]\) 也一定是非法的。

所以说,对于一个 \(r\),存在一个分界点,使得左边的 \(l\) 都不合法,而右边都合法(或者反过来)

如果满足这个性质我们就可以尝试二分。或者寻找接下来的一条性质。

对于所有的 \(r\),其 \(l\) 随着 \(r\) 的增加而单调变化

相当于考虑继承上一个 \(r\) 的答案。

如果 \([l \ r]\) 是非法的那么 \([l\ r+1]\) 也一定是非法的。那么 \(l\) 是单调递增的。

此时则可以尝试双指针。

I - 平均数问题

考虑前缀和:\(ans = \sum_{l = 1}^n \sum_{r = l}^n\frac{sum[r] - sum[l -1]}{r - l + 1} = \sum_{L = 1}^n\frac {1}L \sum_{r = L}^{n}sum[r] - sum[r - L]\)

再对 sum 做前缀和,即可将 \(\sum_{r = L}^{n}sum[r] - sum[r - L]\) 优化到 \(O(1)\)

考虑计算贡献

计算贡献,推出公式,然后化简

考虑 \(a_i\) 的贡献,显然它的贡献只与区间长度有关。

考虑 \(i (i \le n - i + 1)\)
长度为 \(1\) 的区间 \(1\) 个。

长度为 \(2\) 的区间 \(2\) 个。

…………

长度为 \(i\) 的区间 \(i\) 个。

长度为 \(i+1\) 的区间 \(i\) 个。

…………

长度为 \(n - i+1\) 的区间 \(i\) 个。

长度为 \(n - i+1+1\) 的区间 \(i-1\) 个。

长度为 \(n - i+1+2\) 的区间 \(i-2\) 个。

…………

长度为 \(n - i+1 + (i-1) = n\) 的区间 \(i-(i-1) = 1\) 个。

所以 \(a_i\) 的贡献为 \(\sum_{L = 1}^iL\frac{1}{L}+ \sum_{L=i+1}^{n - i + 1}i\frac{1}L + \sum_{L =n-i+2}^{n}(n+1 - L)\frac 1 L\)。每一项都可以数列求和化简或者预处理。

对于 \(i>(n - i + 1)\),可以倒着再算,或者重新推一个式子。

E - 计算几何

首先你要发现一个充要条件:\(n\) 边形的最长边小于 \(\frac{m} {2}\)

许多要求满足所以条件都小于 xxx 一半的计算题,我们往往考虑计算其反面

这题即为:将 \(m\) 切成 \(n\) 段,使得每段长度都小于 \(\frac m 2\)

反面:存在某段的长度大于等于 \(\frac m 2\)

但是长度大于等于 \(\frac{m}{2}\) 的最多只可能有 \(2\) 段,又因 \(n\ge 3\),所以最多只有 \(1\) 段。换句话说,在所有切割方案中:长度大于等于 \(\frac{m}{2}\) 的数量要么为 \(0\)(即合法方案),要么为 \(1\)(即不合法方案)。那么我们考虑计算不合法方案。

考虑枚举最大段的长度,\(\frac{m}2 \le L \le m\)。那么将这一段从 \(m\) 中“挖”去后,还剩下两段,且他们的长度为 \(a, b\ \ (a + b = m - L)\)

那么此时我将这两段切成 \(n - 1\) 段,根据隔板法:\(C_{a - 1 + b - 1} ^ {\ n - 3}\)。另外注意 \(a = 0(or \ b = 0)\) 时:即为 \(C_{b - 1}^{\ n - 2}\)

综上:对于一个 \(L\)

1.\(\sum_{a= 1}^{m - L - a = b \ge 1}C_{a - 1 + b - 1} ^ {\ n - 3} = \sum_{a= 1}^{a\le m -L - 1}C_{m - L - 2} ^ {\ n - 3} = C_{m - L - 2} ^ {\ n - 3} \times \max(0, m-L-1)\)

2.\(C_{m-L}^{\ n - 2} +C_{m-L}^{\ n - 2}\)

参考例题 https://www.luogu.com.cn/problem/P5664(比较难,不会写没关系,按照上述分析一部分即可)。

如果对隔板法等知识还不熟悉可以学习 8 种经典的球盒模型。

\(T = 10^6\) 简单说下:

主要考察组合式的一些变形:

2.\(2C_{m-L}^{\ n - 2}\)。利用 \(\sum_{i= 1}^mC_i^{\ n} = C_{m+1}^{\ n+1}\) 求和。

1.\(\sum_{i=1}^{\frac{m}2}C_{i - 2} ^ {\ n - 3} \times (i- 1)\)\(C_{i - 2} ^ {\ n - 3} \times (i- 1) = \frac{(i - 1)!}{(n - 3)!(i - n + 1)!} = \frac{(i - 1)!}{(n - 2)!(i - n + 1)!}(n - 2) = C_{i-1}^{n-2} (n - 2)\)

上式 \(= (n - 2) \sum_{i=1}^{\frac{m}2}C_{i-1}^{n-2}\)。同样上述公式求和。

posted @   lyhy  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示