您的位置:首页 > 其它

JZOJ. 4300 装饰大楼

2016-04-16 15:01 204 查看

Problem

Description

国际信息学奥林匹克竞赛将要在日本召开了。为了欢迎全世界的选手们,委员会决定将从机场到宿舍沿路的大楼装饰起来。根据某著名设计师的设计,做装饰的大楼从机场到宿舍的方向必须高度严格递增。也就是说,如果做装饰的大楼从机场开始高度顺次为h1,h2,h3,…,那么必须满足h1

Input

第一行一个正整数N,表示从机场到宿舍沿路的大楼数量。

接下来N-1行,第i行(1<=i<=N-1)为Bi,表示K理事长收到的第i个数的值。

Output

输出一行一个正整数,表示可能的A数组的数量

Sample Input

4

1

1

2

Sample Output

5

HINT

合法的A数组共有以下5种:

1,2,1,2,此时的高度序列为2413或3412

1,1,2,3,此时的高度序列为2134

1,1,2,1,此时的高度序列为3241

1,1,2,2,此时的高度序列为2143

1,1,1,2,此时的高度序列为3214

Data Constraint

对于10%的数据,N<=8

对于40%的数据,N<=300

对于100%的数据:

2<=N<=10^6

1<=Bi<=N (1<=i<=N-1)

Solution

其实很多人仔细看都可以看到,h1< h2< …< hi这i个数组成的序列是上升序列,而A[i]则表示h[1]…h[i]之中最长上升子序列的个数。(我当时没有发现——biiiiii)

因为A[i]是由某一个A[j] (1<=j< i)+1转移的来的,所以A[i]其实就等于max(a[j])(1<=j< i)+1。

不要高兴的太早。

有两种情况:

1.B[1]~B[i]取遍了1-k,且B[i+1]<=k+2.

还有判重这个东西。至于判重,设mx=max(a[j]),则答案就等于mx+1。我们发现如果mx+1≥B[i+1]就要将答案减1.为什么呢?

现在开始证明(如果mx+1≥B[i+1]就要将答案减1,以及答案的推算)

我们假设有这么一个序列,

(1,1,1,1,2,3,k,…其中这个数列的第i1个数为k)那么我们从第i1-1和第i1位之间插入k,和从第i1位与第i1+1位插入k,所得的序列是一样的。因为答案要增加mx+1,意思是在第i位和第i+1位之间插入1~mx+1个一次,而B[i+1]只等于一个数。所以如果mx+1≥B[i+1]就要将答案减1。

2.B[1]~B[i]没有取遍1-k,且只缺少了1~k中的1个。

设这个缺少的数为x,那么被删除的这个数一定要插入到某一个地方,且这个地方的前面一个数一定为x-2,且这个被删除的数为x-1.

怎么做呢?

首先定义一个标记数组bz,一开始bz[0]=true,原因自己想。循环过程中假如此时B[i]-1在之前没有出现,则要将i这个位置记下来,这个B[i]记下来,记为WW,且i尽量小。找到这个位置后,我们要统计答案。这个时候假如发现B[i]=WW-2,则表明i~这个位置的所有空格必须插入WW-1.答案即为i~这个位置的所有的空格数。

注意存在无解的情况:

1.B[1]~B[i]取遍了1-k,且B[i+1]>k+2.

2.B[1]~B[i]没有取遍1-k,且缺少了1~k中的2个或以上。

——By Wzy 2016.4.16
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: