Codeforces Round 1032 (Div. 3) 部分题解

F 题我的大力哈希被卡了哈哈。

做的很慢仍需要加练。

img

G. Gangsta

题目链接

我的做法比较复杂:

考虑先计算由 \(1\) 数量决定的区间价值和,设 \(pre_i\)\(1\) 的前缀和,那区间合法的条件为:

\[\begin{align*} pre_r-pre_{l-1}&>\lfloor\frac{r-l+1}{2}\rfloor \\ 2pre_r-2pre_{l-1}&>r-(l-1) \\ 2pre_r-r&>2pre_{l-1}-(l-1) \end{align*}\]

所以确定 \(pre\) 后,只需要在所有的满足上式的 \(pre\) 中计算,一个区间的价值为 \(pre_r-pre_{l-1}\) 所以需要记录每个 \(2pre_x-x\) 的位子的 \(pre\) 的和和数量,查询时查询这两个值计算。

计算 \(0\) 将原数组反转即可,这时忽略了 \(0\)\(1\) 相等的情况,此时上式的大于号应取等号,并且要保证区间长偶数,即:\(r\)\(l-1\) 奇偶性相同,用哈希表维护就行。

\(2pre_x-x\) 可能是负数,做一个移位就行。

code

H. Ice Baby

我的大数据结构做法。

区间是可以离散化的,因为不要求严格上升,保持区间的相对大小不影响最终答案。

考虑设 \(f_{i,x}\) 为考虑 \(a_1-a_i\),末尾数字为 \(x\) 的最长序列长度。

\[f_{i,x}=\max_{k=1}^x f_{i-1,k}+1,L\leq x \leq R \]

不太好维护,\(f_x\) 没有很好的性质,注意到转移的前缀最大值,可以改状态为 \(f_{x}\) 为最后一个数最大为 \(x\) 的长度,转移就很美观:

\[f_{i,x}=f_{i-1,x} +1 \]

我们的转移流程为:先对 \(L\leq x\leq R\) 的位置转移,并且由于需要满足 \(f_x\) 的递增性质,需要将后半段的不满足递增的 \(f_x\) 补足,即做一个 \(f_x=\max(f_x,f_{x-1})\) 的递推操作,由于 \(f_x\) 本身就是递增的,再做一个区间加一后,会有从修改右端点往后的一段区间需要更改(比如 \(f_x=[1,1,2,2,2,2,4]\) ,对区间 \([3,4]\) 做区间加一后应该 \(f_x=[1,1,3,3,\underline{3,3},4]\))。

前半段的转移就是区间加一,后半段的转移就是二分找到位置加区间覆盖,可以用一个线段树维护这些操作。

code

题外话:H 由于找后继区间时忘记右端点减一了挂了两发 😦

posted @ 2025-06-18 12:33  蒻蒻虫  阅读(155)  评论(0)    收藏  举报