这题还是需要思考一会的。
1.初步思路
首先,由第三个条件bi+1=bi或bi+1=bi+1,我们可以知道:bi+1⩾bi
所以,这个数列一定是升序排列的!
再回过头来看第二个条件:如果ai=aj,则bi=bj。
那么,在一个升序排列的数列中,有两个数相等,会发生什么呢?这两个数之间的所有数都相等!
假设bi,bj之间有一个数bk不与它们相等。
那么,如果bk>bi,又因为bi=bj,所以bk>bj。
又因为k<j,所以bk⩽bj,矛盾。
同理可证bk<bj一样不可能。
所以,如果bi=bj,那么一定有bi=bi+1=bi+2=⋯=bj−1=bj。
也就是说,如果ai=aj,那么区间[bi,bj]中的每一个数都只有一种可能的情况。
换言之,它们都随着bi的改变而改变,所以它们只有一种可能的情况。
进一步,如果有两个重叠的区间,那么这两个区间中的每一个数应该都是相等的。
即如果ai=aj,an=am,且i<n<j<m(保证是重叠的),那么必有bi=bi+1=⋯=bm−1=bm。
则此时我们就可以把区间[bi,bj]与区间[bn,bm]看作一个区间[bi,bm]。
比如样例,a1=a3,a2=a4,则b1=b2=b3=b4。
再回过头来看题,我们可以发现,我们只需要统计出那些可以+1的位置的数量t,则 2t 就是最终答案,因为可以+1就意味着这个位置有两种可能的情况。
2.实现思路
大致思路就是先输入,然后从后往前扫一遍记录下每个数最后出现的位置r,然后再从前往后扫一遍,途中不断更新r即可。
至于快速幂取余,可以去看P1226 【模板】快速幂||取余运算
至于代码,就不贴了。在明白了以上知识之后,写出一篇AC代码是很容易的啦~ (逃
The end.