P9993 [Ynoi Easy Round 2024] TEST_133 题解
思路#
看到时限这么大,考虑暴力做法。
我们将原序列分为
同时对于每个数可以维护一个真实值与一个历史最值。
那么下传标记可以写成这样。
inline void push(int p)
{
fro(i, L[p], R[p])
sum[i] = max(sum[i], a[i] + madd[p]),
a[i] = a[i] + add[p];
add[p] = madd[p] = 0;
}
考虑所有数
有一个很暴力的想法是,对于散块我们我们直接遍历,整块时二分解决问题。
那么对于每个块我们可以在开始构建与重构时进行排序维护。
inline void make(int p)
{
iota(s + L[p], s + R[p] + 1, L[p]);
sort(s + L[p], s + R[p] + 1, [&](int x, int y){
return a[x] < a[y];
});
num[L[p]] = sum[s[L[p]]];
fro(i, L[p] + 1, R[p]) num[i] = max(num[i - 1], sum[s[i]]);
fro(i, L[p], R[p]) b[i] = a[s[i]];
}
其中,
同样,在修改时,我们整块可以只维护标记,而散块需要下传重构。
inline void upd(int l, int r, int x)
{
push(pos[l]);
fro(i, l, r) a[i] = a[i] + x, sum[i] = max(sum[i], a[i]);
make(pos[l]);
}
inline void change(int l, int r, int x)
{
if(pos[l] == pos[r])
return upd(l, r, x);
upd(l, R[pos[l]], x);
upd(L[pos[r]], r, x);
fro(i, pos[l] + 1, pos[r] - 1)
add[i] = add[i] + x,
madd[i] = max(madd[i], add[i]);
}
这样,就在
可能可以通过分散层叠做到严格根号,但是不需要了。
Code#
AC记录。
作者:JiaY19
出处:https://www.cnblogs.com/JiaY19/p/17935159.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)