杂题
题意
给定一个长度为\(n\)的\(\text{01}\)序列,可以将序列分成若干块(每个位置恰好属于一个块),使得每个块和为奇数,对于\(i\in[1,n]\),求每块长度\(\le i\)最少可以分成多少块。
\(n\le 1e6\)
做法
假设每块长度不超过\(m\)。
令原序列为\(\{a_i\}_{i=1}^n\),令\(b_i=\bigoplus\limits_{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 3\lceil\frac{n}{m}\rceil\)。
观察3:若\(i\)存在解走到\(n\),那么每次走(2)必定能走到,且步数\(\le 3\lceil\frac{n-i+1}{m}\rceil\)。
现在,我们得到了一个\(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)\),\(\sum\limits_{m=1}^n \min(n,(n/m)^2)\)是\(O(n\sqrt{n})\)级别的。
\(O(n\log n)\)预处理出点\(i\)走到\(n\)最小的\(m\)是多少,则可以单次\(O(\text{最优步数})\),总复杂度\(O(n\log n)\)。