Codeforces Round 1032 (Div. 3) 部分题解
F 题我的大力哈希被卡了哈哈。
做的很慢仍需要加练。

G. Gangsta
我的做法比较复杂:
考虑先计算由 \(1\) 数量决定的区间价值和,设 \(pre_i\) 为 \(1\) 的前缀和,那区间合法的条件为:
所以确定 \(pre\) 后,只需要在所有的满足上式的 \(pre\) 中计算,一个区间的价值为 \(pre_r-pre_{l-1}\) 所以需要记录每个 \(2pre_x-x\) 的位子的 \(pre\) 的和和数量,查询时查询这两个值计算。
计算 \(0\) 将原数组反转即可,这时忽略了 \(0\) 和 \(1\) 相等的情况,此时上式的大于号应取等号,并且要保证区间长偶数,即:\(r\) 和 \(l-1\) 奇偶性相同,用哈希表维护就行。
\(2pre_x-x\) 可能是负数,做一个移位就行。
H. Ice Baby
我的大数据结构做法。
区间是可以离散化的,因为不要求严格上升,保持区间的相对大小不影响最终答案。
考虑设 \(f_{i,x}\) 为考虑 \(a_1-a_i\),末尾数字为 \(x\) 的最长序列长度。
不太好维护,\(f_x\) 没有很好的性质,注意到转移的前缀最大值,可以改状态为 \(f_{x}\) 为最后一个数最大为 \(x\) 的长度,转移就很美观:
我们的转移流程为:先对 \(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]\))。
前半段的转移就是区间加一,后半段的转移就是二分找到位置加区间覆盖,可以用一个线段树维护这些操作。
题外话:H 由于找后继区间时忘记右端点减一了挂了两发 😦

浙公网安备 33010602011771号