题意
给定一个长度为(n)的( ext{01})序列,可以将序列分成若干块(每个位置恰好属于一个块),使得每个块和为奇数,对于(iin[1,n]),求每块长度(le i)最少可以分成多少块。
(nle 1e6)
做法
假设每块长度不超过(m)。
令原序列为({a_i}_{i=1}^n),令(b_i=igopluslimits_{j=1}^i a_j)。
那么就是从(0)到(n),每次跳的位置不用于当前的(b_i)。
观察1:若当前在位置(i),最优解一定为这两种情况:
(1)((i,i+m])内离(i)最远的,不同于(b_i)的位置。
(2)假设(1)的位置为(j),最大的(k(b_k=b_i))使得((i,k))存在不同于(b_i)的。
那么可以在预处理后,单次(O(n))次求解。
观察2:若存在解,则最少步数(le 3lceilfrac{n}{m} ceil)。
观察3:若(i)存在解走到(n),那么每次走(2)必定能走到,且步数(le 3lceilfrac{n-i+1}{m} ceil)。
现在,我们得到了一个(O(n/m))单次判断是否存在解。
观察4:若在(i)走(1)能到达(n),那存在最优解在这一步走(1)。
现在,得到了一个单次(O((n/m)^2))求解:即每次(O(n/m))判断(1)位置是否可以到达(n),若可以则走,否则走(2)。
结合(O(n))的做法,得到了一个(min(n,(n/m)^2)),(sumlimits_{m=1}^n min(n,(n/m)^2))是(O(nsqrt{n}))级别的。
(O(nlog n))预处理出点(i)走到(n)最小的(m)是多少,则可以单次(O( ext{最优步数})),总复杂度(O(nlog n))。