[NOIP集训]10月20日

今天的文件夹:10月20日.zip

今天是搜索题专练。

T1:这题用搜索找规律可以,AC就别想了。搜索起来,每次枚举两种操作(push和pop),判断是否合法,递归$2n$次后比较出栈序列并统计总数。当然,对于极限数据这是不能通过的(一共要递归$2n$层,总的时间复杂度为$O(2^{2n})$),因此要用数学方法。

经过数学上的推导(详情百度,这里给大家一个链接百度百科),结果应该是第$n$个Catalan数,即

[h(n)=sum_{i=1}^{n-1}h(i)*h(n-i)=h(n-1)*frac{4n-2}{n+1}=frac{C_{2n}^{n}}{n+1}]

其中$h(0)=h(1)=1$。

计算输出即可,注意数据不要爆了int64。

T2~T9晚上再填。。。

T10:对于不能的情况,方法很简单。我们对所有的临近湖泊的点做一次BFS,看能到达临近沙漠的哪些点,最后统计输出即可。而对于能实现的情况,我们也可以用这种方法,统计出每个临近湖泊的点如果修建蓄水池的话,可以到达的所有点。

现在,我们有了这些数据,要求出覆盖所有临近沙漠的点时,最少要修建的蓄水池个数。这看起来很像一个集合覆盖问题,然而这个问题貌似是NP难的,不可能实现这样的规模。这告诉我们,这道题一定存在一些特殊性,只是还没有被利用。

考虑样例2,我们发现,对每个最上面的点(记为$a[1,i]$),可以到达最后一行的点(记为$a[n,j]$)的集合,总能构成一条连续线段。例如,$a[1,1]$可以到达$a[n,1],a[n,2]$,$a[1,3]$可以到达$a[n,2],a[n,3],a[n,4]$等等。这条规律是否普遍成立,还要证明:

定理:在能满足要求,即每一个点$a[n,j](1 leq i leq m)$都可到达的情况下,对任意点$a[1,i](1 leq i leq m)$,它可以到达的最后一行的点总是连续的一段。

证明:采用反证法,假设存在一个点(或一个区间),它左右两侧均可由同一点到达,而这个点不能。

因为所有点都能被到达,所以必有一个最上方的点可以到达这个点,这两点间的路径(记为$p$)肯定与$a[1,i]$到左右两侧的两个点的两条路径中的至少一条相交(可以分情况证明),那么我们在交点处,令$a[1,i]$出发的路径沿着$p$行进,可以到达$a[n,j]$而不违反任何规则。这就推出了此点可以由$a[1,i]$到达,发生矛盾。

综上,定理得证。因此,这些集合可以看做$m$条线段,要让它们覆盖另一条线段。这不就是经典的线段覆盖模型吗?我们令$s[i],t[i]$分别表示第$i$条线段的起点、终点,$ans[i]$表示线段$1..i$至少需要多少条线段来覆盖,那么

[ans[i]=min{ans[i],ans[s[j]-1]},s[j] leq i leq t[j],i geq 2]

原文地址:https://www.cnblogs.com/changke/p/4894569.html