T1的题解
一道小清新的思维题!和 \(bocchi\) 酱一样可爱的喵
30 pts
首先典中典套路:破环成链,数组复制一份。
设 \(to[i] = \max(\mathbb j) (j\geq i \wedge \sum_{i \leq l \leq j} a_l \leq k)\)
枚举起始下标,容易想到贪心,考虑前 \(i\) 个已经确定好怎样分段了,下一个段一定是 \([i, to[i]]\),用 \(dp\) 易证,是一个比较简单的贪心。
单次时间复杂度 \(O(n^2)\)。
60 pts
可持久化数据结构优化 \(dp\)。
设 \(dp[i][j]\) 表示末尾为 \(i\),已划分 \(j\) 个段能达到的最小的初始下标。
转移方程非常非常简单,\(dp[i][j] = \min (dp[k][j - 1]) (k < i \wedge to[k] \geq i)\)
容易分析出来 \(j\) 相同的情况下 \(dp[i][j]\) 随着 \(i\) 的增大而增大,所以状态转移方程可改写为 \(dp[i][j] = dp[fst = \min(k)][j - 1] (k < i \wedge to[k] \geq i)\)
那么 \(dp[i] = dp[fst]\) 然后右移一位再添加一个 \(dp[i][0] = i\) 即可,用可持久化平衡树就能实现,当然魔改一下主席树也是可以的。
单次时间复杂度 \(O (n \cdot log_2n)\)
100 pts
均摊摊成一地即可(如下图我的乖女鹅)
令 \(p = i (to[i] - i = \min(to[j] - j)(j \in [1,n]))\)
易证 \(\neg \exists i \neq j,to[i] > to[j] \vee i<j\),即不存在 \([i, to[i]]\) 区间被 \([j, to[j]]\)包含。也就是说分割区间的分割点一定有一个在 \([i, to[i]]\) 内,那么我们就枚举 \(j \in [p,to[p]]\) 作为第一个区间的分割点,然后利用 \(to[j]\) 找到下一个分割点,由于 \(to[p] - p\) 是最小的,所以说对于每一次枚举分割点,我们算答案的上届时间复杂度 \(O (\frac{n}{to[p] - p})\),那么总体时间复杂度为 \((to[p] - p) * O(\frac{n}{to[p] - p}) = O (n)\)。
单次时间复杂度 \(O (n)\)