NOI导刊2009 提高一

时间:2022-06-09 20:45:45

zzh大佬给我说导刊的题全是普及难度,然而我。。觉得有两道题是提高的

LocalMaxima

题目解析

对于\(i\)这个数,它要想成为LocalMaxima,比它大的要全部放到最后去,比它小的想怎么放就怎么放。所以说,这个数能成为LocalMaxima的期望就是\[(n - i)! / (n - i + 1)! = \frac{1}{n - i + 1}\], 那么总的期望就是\[\sum_{i = 1}^{n} \frac{1}{n - i + 1} = \sum_{i = 1}^{n} \frac{1}{i}\], 于是我们就有了线性的做法,但是这显然是不合乎要求的。

我们知道, \(\sum_{i=1}^n \frac{1}{i}\)这样的一个调和级数是发散的,不存在极限,但是欧拉曾经证明\(\sum_{i=1}^n \frac{1}{i} - ln(n)\)是收敛的。它的极限是存在的。设这个极限是\(r\)\(r\)被称作欧拉常数。它的近似值约\(0.57721566490\),于是我们有了一个求解\(s\)的算法,那就是\(s = ln(n +1) +r\)
\[r = \lim_{n \rightarrow \infty} ^ {} \left ( \left ( \sum_{i=1}^n \frac{1}{i} \right ) - ln(n) \right ) = \int_1^{\infty} \left ( \frac{1}{[x]} - \frac{1}{x} \right ) dx\]

最长括号匹配

题目解析

首先我们考虑一下如何判断一个串是不是合法串。

我们只需要抽离一个经典的栈的模型,用左括号压栈,右括号弹栈,只有一个合法的压栈,弹栈序列才是合法的括号串。因为这里有两种括号,因此我们还需要增加一个匹配的条件。

假设我们用\(str[0...L-1]\)储存括号序列,\(stack\)模拟栈,\(stack[i]\)记录第\(i\)层栈储存的元素在\(str\)中的下表,top标记栈顶。

几个比较显然的性质:假设在\([L,R]\)中出现了非法弹栈,那么对于任意区间\(L \le a \le R\),则区间\([a,b]\)必然是非法的,因为弹栈和压栈操作相互独立。
于是不难得出下面的模拟算法:

对于括号\(str[i]\)对应的操作,如果是压栈,则压栈,若果是合法弹栈,就弹栈,并且更新答案。如果是非法弹栈,就立刻清空栈。最终输出答案。

Magicfingerprint

题目分析

我们有个很显然的打表算法,由于可以估算出这个序列应该比较分散,所以对于\(30pts\),100kb之内是没有问题的。

我们有一个很显然的反向dfs方法,不停添加位数,然后sort一下, \(On\)查询一下就行了