思路:这里首先定义几个数组:表示以i结尾的最长完美序列的开头位置,为以2为底i的对数,f数组为每段区间l到r之间的st数组的最大值,为上次出现的位置。然后考虑如何更新st数组,首先,明显st数组是单调递增的,也就是大于等于,其次,它肯定大于等于的上一次的出现位置。考虑L到R这段区间,以R右侧为右端点的我们可以忽略不计(想一想,为什么),L左侧更不用说。因此我们只需要考虑以L到R这段区间为右端点即可。左端点<=L的右端点一定越靠又越好,我们可以二分找出左端点第一个大于等于L的位置x,长度就是x-l+1,之后,左端点在L到R区间内的,我们直接用表维护即可。代码: #include<cs...