杂题

题意

给定一个长度为\(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)\)

posted @ 2021-06-09 14:22  Grice  阅读(64)  评论(0编辑  收藏  举报