题解 CF1102E 【Monotonic Renumeration】

这题还是需要思考一会的。


1.1.初步思路

首先,由第三个条件bi+1=bib_{i+1}=b_ibi+1=bi+1b_{i+1}=b_i+1,我们可以知道:bi+1bib_{i+1}\geqslant b_i

所以,这个数列一定是升序排列的!

再回过头来看第二个条件:如果ai=aja_i=a_j,则bi=bjb_i=b_j

那么,在一个升序排列的数列中,有两个数相等,会发生什么呢?这两个数之间的所有数都相等!

假设bi,bjb_i,b_j之间有一个数bkb_k不与它们相等。

那么,如果bk>bib_k>b_i,又因为bi=bjb_i=b_j,所以bk>bjb_k>b_j

又因为k<jk<j,所以bkbjb_k\leqslant b_j,矛盾。

同理可证bk<bjb_k<b_j一样不可能。

所以,如果bi=bjb_i=b_j,那么一定有bi=bi+1=bi+2==bj1=bjb_i=b_{i+1}=b_{i+2}=\cdots=b_{j-1}=b_j

也就是说,如果ai=aja_i=a_j,那么区间[bi,bj][b_i,b_j]中的每一个数都只有一种可能的情况。

换言之,它们都随着bib_i的改变而改变,所以它们只有一种可能的情况。

进一步,如果有两个重叠的区间,那么这两个区间中的每一个数应该都是相等的。

即如果ai=aj,an=ama_i=a_j,a_n=a_m,且i<n<j<mi<n<j<m(保证是重叠的),那么必有bi=bi+1==bm1=bmb_i=b_{i+1}=\cdots=b_{m-1}=b_{m}

则此时我们就可以把区间[bi,bj][b_i,b_j]与区间[bn,bm][b_n,b_m]看作一个区间[bi,bm][b_i,b_m]

比如样例,a1=a3,a2=a4a_1=a_3,a_2=a_4,则b1=b2=b3=b4b_1=b_2=b_3=b_4

再回过头来看题,我们可以发现,我们只需要统计出那些可以+1+1的位置的数量tt,则 2t2^t 就是最终答案,因为可以+1+1就意味着这个位置有两种可能的情况。


2.2.实现思路

大致思路就是先输入,然后从后往前扫一遍记录下每个数最后出现的位置rr,然后再从前往后扫一遍,途中不断更新rr即可。

至于快速幂取余,可以去看P1226 【模板】快速幂||取余运算


至于代码,就不贴了。在明白了以上知识之后,写出一篇AC代码是很容易的啦~ (逃

The end.\text{The end.}