本次综合训练主要是2013年的大连online的题目,有难有易,其中题意不太清楚和要求非常高的题目就直接剔除了。这样题数少了,于是又加了2题2016年大连online的我觉得挺不错的题目。后来发现知识点有点重叠,不过训练一下也无妨。
Find the maximum
题意:给出 $N$ 求出最小的 $2\leq n\leq N$ 使得 $n/\varphi(n)$ 最大。
题解:做这题首先要知道 $\varphi(n)$ 的计算式(不作证明): $\varphi(n)=n(1-\frac{1}{p_{1}})(1-\frac{1}{p_{2}})…(1-\frac{1}{p_{k}})$
$$\therefore n/\varphi(n)=\frac{1}{(1-\frac{1}{p_{1}})(1-\frac{1}{p_{2}})…(1-\frac{1}{p_{k}})}$$ $$=\frac{1}{\frac{p_1-1}{p_1}\frac{p_2-1}{p_2}…\frac{p_k-1}{p_k}}$$ $$=\frac{p_1}{p_1-1}\frac{p_2}{p_2-1}…\frac{p_k}{p_k-1}$$ $$=(1+\frac{1}{p_1-1})(1+\frac{1}{p_2-1})…(1+\frac{1}{p_k-1})$$
其中 $p_1,p_2,…p_k$ 为 $n$ 的质因子。(考虑到大家提交的很多代码都是打表,这里我写的比较详细)
明显地:
- $p_1,p_2,…p_k$ 越小,$n$ 越小,而且 $n/\varphi(n)$ 越大;
- $p_1,p_2,…p_k$ 的次方数没有贡献。
所以,只需要把最小的那些质数乘起来,就能得到满足条件的 $n$
为了增加(编程)难度,这题又加入了高精度,套用模板,代码如下:
1 |
|
The Frog’s Games
题意:青蛙要跳过一条长为 $L$ ,两岸之间有 $n$ 块石头的河,最多只能跳 $m$ 次,求青蛙至少需要的跳跃能力(跳一次的最大长度)。
题解:可以发现,最后的答案具有单调性,即,若跳跃能力 $k$ 可以跳过这条河,那么跳跃能力 $x(x\geq k)$ 一定能跳过这条河。
由此,使用二分答案可以解决,代码如下:
1 |
|
Different GCD Subarray Query
题意:给出 $N$ 个数,每次询问 $[L,R]$ 的子数组(类似子串)的 $GCD$ 有多少不同的值。
题解:做这题首先要知道一个结论,值为 $X$ 的数连续地跟其它数进行 $GCD$ 运算,最多出现 $\left \lfloor log_{2}{X}\right \rfloor$ 个不同的数。这个结论刚听到可能很新鲜,但其实很好理解,$GCD$ 运算之后出现了新的 $X$ ,说明新的 $X$ 至少少了一个质因子。而质因子最多有 $\lfloor log_{2}{X}\rfloor$ 个。所以 $GCD$ 个数最多也就 $NlogMAX$ 个,可以用 $map$ 来保存。
其次还需要知道一个技巧,如何统计一个区间内不同的数。对于一个右端点 $R$ ,我们保存能使得值 $X$ 出现的最大的 $L$ ,并在 $L$ 这一点加1,那么每次询问的答案就是 $[L,R]$ 的区间和。
这样把所有询问离线并排序以后,就可以从 $1$ 开始枚举右端点,代码如下:
1 |
|
The kth great number
题意:给 $n$ 个操作,支持插入和求第 $k$ 大。
题解:一定要认真读题!这道题目的 $k$ 是一开始就给定的,是不会变的!
理解了这一点这就是一道水题,代码如下:
1 |
|
Dave
题意:在二维平面上给 $N$ 个不重合的点,问边长为 $R$ 的正方形最多能包含多少个点(包含边界)
题解:因为这一题 $1\leq N\leq 1000$ ,所以只要枚举每个点作为左下角的情况就行了(为什么?)
如果 $1\leq N\leq 10000$ ,那么可以用扫描线+线段树的解法。先离散化,并将所有点按照 $x$ $y$ 两个关键字从小到大排序,我们想象垂直于 $x$ 轴有两条间距为 $R$ 的直线,这两条线不断的向右移动,右边的一些点会进入,左边的一些点会退出。那要怎么统计呢?这里要用到一个奇妙的处理,把每一个点向上延伸 $R$ 产生的这条线段加到线段树,也就是区间加1,最后只要每次统计从最低到最高的每个点的最大值就行了(为什么?)
这个做法听起来很简单,不过由于离散化等原因,很容易写错(WA3 = =),代码如下:
1 |
|
Weak Pair
题意:一棵树的每个节点有一个非负权值,如果 $u$ 是 $v$ 的祖先($u\neq v$),并且两点的权值的积 $a_u*a_v\leq k$ ,则称它们为"Weak Pair"。求"Weak Pair"的数目。
题解:由于树中任意一个节点的祖先都在同一条链上,所以只需要考虑如何快速的求出一条链上的"Weak Pair"。这题有很多解法,我想到的是将祖先都插入到树状数组,那么在 $u$ 这一点,答案就加上 $x\leq \frac{k}{a_u}$ 的个数。
考虑到权值范围很大,要用离散化,并且要注意 $a_u=0$ 的情况,代码如下:
【还有一点就是,题目给的是明确的父子关系,但是没有给根,一定要自己找,WA3 = =
1 |
|