其他分享
首页 > 其他分享> > 2021.09.03pm

2021.09.03pm

作者:互联网

---- 预期 实际
A 100 91
B 100 91
C 100 20
D 100 100
E 100 100
F 0 0
G 0 0
H 0 0
S 500 402

这次题"质量不错",心态崩了

A 亲密数对 \(\blacktriangle\!\blacktriangledown\)

其实是满水的一道题,由于范围不大,既可以考虑打表,亦可以直接暴力算,枚举每一个数,按照题意模拟即可。时间复杂度 \(O(n^2)\)。
\(9pts\) 挂在枚举时没有考虑亲密(映射)是否在n范围内

B 吉祥数 \(\blacktriangle\!\blacktriangledown\)

还是暴力模拟。先按照升序 \(sort\) (以方便输出),再按照题意计算并剔除 \(ban\) 掉的数就行
唯一的坑是该轮剔掉的数在下一轮才会生效,这一点我考虑到了,但是想太简单代码写挂了。正确做法是打两种标记,第一种标记 \(vis\) 表示这轮是否剔掉,第二种标记 \(pan\) 表示之前是否剔掉,第一次循环用\(pan=0\) 的数更新 \(vis\) ,第二次循环用 \(vis=1\) 来更新使得 \(pan=1\) 。但是我贪心的在同一个循环内解决了,导致如果出现一个数剔掉了更小的数,则不能将他标记,答案错误\(9pts\)。

C 二叉树输出 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\)

算是求后序遍历的稍升级版,解法挺多,我用的是分治。
但这道题只有 \(20pts\),因为我犯了 \(1mol\) 错误。

  1. 题都没看清,题目中是父亲长度为左右儿子之和,而我写的是左右儿子取 \(max\) (能有20简直奇迹)
  2. 没有判断区间不合法的情况,出现左标大于右标
  3. 上面改对了,只是不会出现段错误,但是,不合法的儿子(不存在的儿子)会对父亲产生奇怪的贡献,导致答案错误!
  4. 但是相比上次有一个问题解决了:命名方式从 \(l1,r1,l2,r2\) 改到了 \(l,r,a,b\)

D 关系网络 \(\blacktriangle\!\blacktriangledown\)

\(\cal {BFS}\) ,时间复杂度 \(O(n)\)

E Fibonacci 前 n 项和 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\)

通过一定的公式推导可以得到,$ \sum_{i=1}^n =f_{n+2}-1$

而这里的 \(n\) 比较大,\(O(n)\)明显过不了
那么明显可以有两种方法:

  1. 分块打表(大概能有 \(O(n/10000)\) )(但是模数是输入的,惨被 \(ban\) )
  2. 考虑\(O(\log n)\) 正解
    • 那么便是大家喜闻乐见的矩阵乘法快速幂了(矩阵乘法满足交换律)
    • 根据矩阵快速幂的性质,不难想到转移方程\(\begin{bmatrix} 1 &1 \\1 &2 \end{bmatrix}\)与初始方程 \(\begin{bmatrix} 1 &1 \end{bmatrix}\)
    • 接下来就是考虑对 \(n\) 进行变形。由于求 \(f_{n+2}\) ,先 \(n+\!=2\) 再说。
    • 再通过一定的观察,当不使用快速幂时,第 \(i\) 次转移
      \(c[i]=\begin{bmatrix} {f_{2*i+1}} & {f_{2*i+2}} \end{bmatrix}\)( \(c[0]\)为初始方程)
      依此调整即可

F 数三角形 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\)

本次考试最难的题,一开始只考虑了从\(\mathrm{C}_{(n+1)*(m+1)}^3\)中扣掉\({(m+1)}* \mathrm{C}_{n+1}^3+{(n+1)}*\mathrm{C}_{(n+1)}^3\),
结果!代码都写完了,运行样例,输出 \(78\),答案 \(76\) 想半天才醒悟还有斜的,当场自闭
下来也半天没想出来。问了大佬才明白。

  1. 首先,我们回忆一下平面向量。平面向量的三要素:起点,方向,长度。我们假设有向量\(\overrightarrow{x}=(i,j)\),我们先定下一个起点\((0,0)\),那么三要素便齐全了。

  2. 此时,我们先把它看成一条线段,\((0,0)\) 和 \((i,j)\) 看成两个端点,由于我们要找三个点共线,为了不重不漏,我们先定下两端点必须选,再枚举中间的每一个整点(这样内部的点即使与\((0,0)\)配对也不可能选择\((i,j)\)而不重,而若能找到所有向量则不漏)

  3. 那么,此时抽象出了一个子问题:在一条起点为 \((0,0)\) ,终点为 \((i,j)\) 的线段上找整点。

    • 我们先写出这条线段的解析式:$y=\dfrac{j}{i}x (i=>x>=0) $ 再考虑适当变形:$y=\dfrac{j^\prime\gcd (i,j)}{{i^\prime}\gcd (j,i)}x (i=>x>=0,i\prime与j\prime互质) $
    • 那么,很显然,\(x \in \{ i^\prime*k\},k \in N^* ,1<=k<=\gcd(i,j)\) 时,有 \(y \in N^*\) 而这样的 \(k\) 有$ \gcd(i,j) -1$ 个(除去端点), \(k\) 即除去端点整数点个数
  4. 而向量大多是可以平移的。那么,我们考虑将起点换个位置,只要起点还是个整点,则中间的整数点数目不变。因为终点 和起点必须在正方形内,我们假设正方形左下角为 \((0,0)\) ,右上角为 \((n+1,m+1)\) ,那么终点(考虑起点和终点一样的) 至少是 \((i,j)\),至多是 \((n+1,m+1)\) 那么我们的终点可以选择\((n+1-i)*(m+1-j)\)个。

  5. 向量的三要素不同则向量不同,我们已经考虑改变起点了,接下来考虑改变方向与长度。我们只需要考虑枚举 \(i\) 与 \(j\) ,就能考虑到所有方向与长度。当然,我们这是以左下角为\((0,0)\) ,方向都是从左下到右上,同理,以右下角为 $ (0,0)$也是一种

  6. 那么我们就有了\(O(n^2)\)的算法公式为:

\[\mathrm{C}_{(n+1)*(m+1)}^3-{(m+1)}* \mathrm{C}_{n+1}^3-{(n+1)}*\mathrm{C}_{(n+1)}^3-2*\sum_{i=1}^{n}\sum_{j=1}^{m}*(n+1-i)*(m+1-j)*(\gcd(i,j)-1) \]

(因为\(i=n+1\)时\(n-i+1=0\),所以直接舍去)
7. 接下来才是折磨,把算法优化到\(O(n)\)
- 首先,(据说是常规操作)\(\gcd(i,j)-1=\sum_{d|\gcd(i,j)}^{d!=1} \varphi (d)\)
- $ d|\gcd(i,j)\(,意味着\)d|i\(,\)d|j$,也就是说, \(i\) 与 \(j\) 为\(d\)的倍数!
- 我们再通过一定转化,从枚举 \(i\) 与 \(j\) 找 $ d|\gcd(i,j)$,转化到枚举 \(d\) ,找\(i,j\)为\(d\)的倍数

$$
2*\sum_{i=1}^{n+1}\sum_{j=1}^{m+1}*(n+1-i)*(m+1-j)*(\gcd(i,j)-1)=2*\sum_{d=2}^{\min(n,m)}\varphi(d)\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}\sum_{j=1}^{\left \lfloor \frac{m}{d} \right \rfloor}(n-id+1)(m-jd+1)
$$
- ~~是不是更复杂了~~
- 通过观察可以发现,此时 $i$与 $j$ 无关,我们可以把 $i$ 提出来:

$$
2*\sum_{d=2}^{\min(n,m)}\varphi(d)\sum_{i=1}^{\left \lfloor \frac{n}{d} \right \rfloor}(n-id+1)\sum_{j=1}^{\left \lfloor \frac{m}{d} \right \rfloor}(m-jd+1)
$$
- 这个数字诸位熟不熟悉?两个等比数列相乘啊!$ \left \lfloor \frac{n}{d} \right \rfloor =n \mod d$ 那么原式又可以化成:

$$
\sum_{d=2}^{\min(n,m)}\varphi(d)(n+d+n\!\mod d+2)*(m+d+m\!\mod d+2)/2
$$

- 那么,我们只需要$O(n)$ 预处理出 $\varphi(d)$ 再 $O(min(n,m))$求出答案累加就行。

G 加工生产调度 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\)

  1. 首先考虑的是 \(DP\) ,但很明显,就这数据范围,就这类型,都不像。
  2. 就考虑贪心。但是考场上没想出来。
  3. 下来一看,发现又是国王游戏升级版(都是两只手,并且左右交换)

解题思路:

  1. 那么同理,考虑左右交换,是否能使结果(总时间更优)
  2. 老样子,从两项开始考虑:假设有两个物件 \(i\),\(j\),如果先加工 \(i\)再加工 \(j\) 那么需要的时间为 \(a[i]+\max(b[i],a[j])+b[j]\),而交换后为 \(a[j]+\max(b[j],a[i])+b[i]\) 那么我们期望得到\(\min(a[i]+\max(b[i],a[j])+b[j],a[j]+\max(b[j],a[i])+b[i])\)
  3. 稍微变一下项,我们可以得到:

\[原式=a[i]+a[j]+b[i]+b[j]+\min(\max(-b[i],-a[j]),\max(-b[j],-a[i])) =a[i]+a[j]+b[i]+b[j]-\max(\min(b[i],a[j]),\min(b[j],a[i])) \]

  1. 那么,我们只用比较 \(\min(b[i],a[j])\) 与$ \min(b[j],a[i])$ ,若前者较大就选择 \(i\) 在前面 \(j\)在后面·····是吗?
  2. 我们变项了半天,可它也只是两个数比较。我们还得验证其是否具有传递性。即在 \(x<y,y<z\) 时要有 \(x<z\) 成立。
  3. 那么在这道题里,我们希望

\[\min(b[i],a[j])>\min(b[j],a[i]),\min(b[j],a[k])>\min(b[k],a[j]) \Longrightarrow \min(b[i],a[k]) >\min(b[k],a[i]) \]

  1. 一般来说这种东西都要分类讨论,比较麻烦,难以证明,故不证明
  2. 但通过 \(Johnson 法则\) ,上式成立,但不完全成立
  3. 主要是对于\(\min(b[i],a[j])=\min(b[j],a[i]),\min(b[j],a[k])=\min(b[k],a[j])\) 的情况,不一定存在 \(\min(b[i],a[k])=\min(b[k],a[i])\) ,故难以排序。
  4. 而对于\(Johnson法则\),我不是很能讲明白,···也不会有人看。这里就只能贴个大佬的链接要是以后再考再仔细写here)

H 灯泡 \(\blacktriangle\!\blacktriangledown\)

数学题。对于这种在墙上增加地上减少,很容易联想到均值不等式。稍微解一下方程便得到答案为:\(H+D-2*\sqrt(D*(H-h))\),当然,有边界条件。即,墙上的影长不能为负数,且不能大于人的高度。(不过因为运算顺序带来的精度损失而错掉4分)

image
\(\cal {Made} \ {by} \ {YuGe}\)

标签:03pm,gcd,min,max,sum,2021.09,blacktriangledown,blacktriangle
来源: https://www.cnblogs.com/u2003/p/15230514.html