Codeforces Round #825 (Div. 2) C2. Good Subarrays (Hard Version)

Codeforces Round #825 (Div. 2)C2. Good Subarrays (Hard Version)

题解

ans[i] 为以 i 为结尾最长的好的数列长度

观察发现,以 i 为结尾的好的数列,长度可以是 1,2,3,...,ans[i]

这个很好理解,因为如果区间数列 [l,r] 是好的,那么 [l+1,r] 一定也是好的。

我们要求的答案也就是 ans[i]

我们先来考虑 ans[i] 是怎么求,显然有 ans[i]=min(ans[i1]+1,a[i]) ,要么在前面的最长的好的数列的基础上往后添一个,要么它最多只能有 a[i] 的长度。

当强制 ans[i]=a[i] 然后按照上述方法算出后面的位置的 ans 时,记 sum[i]=j=inans[j]

sum[i] 数组也比较好求,倒序求出来,可以借助线段树

考虑修改操作,若修改的位置是 x ,显然 x 以前的答案不会改变,若 x 位置答案变成了新的 ans[x] ,那么后面的答案会变成形如 ans[x]+1,ans[x]+2,...,ans[x]+k1,a[x+k]

找到第一个 k 满足 a[x+k]ans[x]+kans[x+k]xkans[x]x ,那么 x 及以后的答案就变成了 i=0k1(ans[x]+i)+sum[k]

k 可以用线段树,然后这个题就做完了,时间复杂度 O(nlogn)

posted @   缙云山车神  阅读(263)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示