NOI导刊2009 提高一


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 ightarrow infty} ^ {} left ( left ( sum_{i=1}^n frac{1}{i} ight ) - ln(n) ight ) = int_1^{infty} left ( frac{1}{[x]} - frac{1}{x} ight ) 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)查询一下就行了

原文地址:https://www.cnblogs.com/Alessandro/p/9608045.html