只能贴部分题解了,因为太弱了。其它题不会,也不怎么感兴趣。
弱渣需要继续努力。
hdu 5714 拍照 题目
大致题意:有一些船在河里以相同的速度水平行驶(有的向左,有的向右),一个人在河边视角90度,问此人在何时何处能看到最多的船。
显然,我们可以把向左的船看作静止的。如果只看静止的船,那么这个问题就变成了最多区间交问题。排序处理一下就行了。不好表达,看代码自然明了。对于向右的船,如果在静止情况最优解的左边,那么会算入最终答案,否则不会。
1 | //#pragma comment(linker,"/STACK:10240000,10240000") // C++ only |
以上代码参考 wwt15
代码优势:用指针迭代,以及 (Node){p,add,type} 的写法值得学习。
hdu 5715 XOR 游戏 题目
大致题意:给你一个长为 $n$ 的数组 $a$,把它分成 $M$ 段,且每段的长度不超过 $L$。求使得所有分段方式中每一段异或和的最小值最大的值。
显然,我们预处理出前缀和 $s$,那么问题就变成了,在 $s$ 中取 $M$ 个数,它们相隔不超过 $L$, 使得相邻数之间的异或和的最小值最大。
二分答案,每次监测答案能否达到,用 $f[i][j] = 1$ 表示以 $j$ 结尾,取 $i$ 个数,相邻数之间的异或和的最小值大于当前答案。显然我们需要确定的是 $f[M][n]$ 是否为 1。
显然 $f[0][0] = 1$,$f[i][j]=1$ 当且仅当 $\exists k, 1 \leq k \leq L$ 使得 $f[i-1][j-k]=1, s[j] \oplus s[j-k] \geq now$。
因此我们直接 $dp$ 就行,但是直接做会超时,因此用数字字典树 Trie 来优化。
即求 $f[i][j]$ 时,把 $f[i][j-k]=1,\; 1 \leq k \leq L$ 的那些 $s[k]$ 丢入到字典树中,那么只要查看字典树中是否存在与 $s[j]$ 异或不小于当前答案的数即可。
1 | //#pragma comment(linker,"/STACK:10240000,10240000") // C++ only |
hdu 5717 矩阵方程的解 题目
此题就是求解线性方程组
$$ (x_1,x_2, \cdots, x_n) A = (1,0,\cdots,0) $$
其中 $A = (a_{ij})_{n \times n}, \quad a_{ij} = [i \mid j]$
题目问,第 $k$ 个 $d$ 在 $x = (x_1,x_2, \cdots, x_n)$ 中 的位置。
由我的博文:两类反演公式及其矩阵形式 知,矩阵 $A$ 的转置本质上就是 Mobius 反演的矩阵形式,因此 $A$ 的逆矩阵 $B = (b_{ij})_{n \times n} $
$$ b_{ij} = \left \lbrace \begin{array}{cc} \mu (\frac{i}{j}), & j|i \\
0, & else. \end{array} \right. $$
而 $x$ 其实就是 $B$ 的第一行,因此 $x_i = \mu(i)$。因为题目保证了有答案,因此 $d$ 只可能是 $-1,0,1$。
由我的博文:数论函数的 Dirichlet 积 知
- $M(n)=\sum_{i=1}^n \mu(i)$ 有计算公式
$$ \sum_{i=1} ^n M(\lfloor \frac{n}{i} \rfloor) = 1 $$ - $Q(n)=\sum_{i=1}^n |\mu(i)|$ 有计算公式
$$ Q(n) = \sum_{d^2 \leq x} \mu(d) \lfloor \frac{x}{d^2} \rfloor $$
那么 $n$ 以内的,使得
- $\mu(m)=-1$ 个数: $\frac{Q(n)-M(n)}{2}$
- $\mu(m)=0$ 的个数: $n-Q(n)$
- $\mu(m)=1$ 的个数: $\frac{Q(n)+M(n)}{2}$
最终我们进行 “二分查找” 答案。当时 TLE 就是因为本渣用的是最普通的二分查找,导致过多计算最后爆炸。这里应该启发式的思考,以后写二分查找一定要对问题的性质进行思考,启发式查找进而减少迭代步数。
1 | //#pragma comment(linker,"/STACK:10240000,10240000") // C++ only |
欢迎批评指正