1 条题解
-
0
自动搬运
来自洛谷,原作者为

Miko35
阿玮你又在打电动喔,去看会书好不好搬运于
2025-08-24 22:30:29,当前版本为作者最后更新于2021-04-08 09:31:29,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
upd:改正了一处笔误(将
l打成了1)验题人又来水题解了。
for(rgi i=1;i<=n;++i){ for(rgi j=1;j<=i;++j)dp[i]=max(dp[i],dp[j-1]+sum(j,i,ma[j][i])); }考虑这个 的 dp,其中 表示前 个数的答案, 表示“将 都改为 取得的收益”, 表示 的 range_max。
看似不大能优化,其实是可以的。记 ,也就是“在 举行一场作弊的收益”。令 时刻的 表示 ,只要我们在 dp 的过程中能随着时间有效维护 数组,就可以使用线段树优化这个 dp 解决问题。
考虑分开计算每个人的贡献。对于一个人 ,它对一个区间 产生贡献当且仅当 。
把它写成 ,换句话说也就是: 都要 ,且其中至少一个 。
我们分别预处理出 的 的范围,记为 。所以当 时, 的范围是 ;当 时, 的范围是 ;当 时,没有贡献。
我们在 到达几个临界点的时候,通过线段树的区间加操作更新 的贡献区间即可。
这样的复杂度是 ,可以通过此题。
核心代码:
for(rgi i=1;i<=n;++i){ if(a[i][0]>r[i])continue; ll[i]=lr[i]=rl[i]=rr[i]=i; for(rgi w=LOG;~w;--w){ chg(rl[i],w,l[i]-1,1),chg(rr[i],w,r[i],1); chg(lr[i],w,l[i]-1,-1),chg(ll[i],w,r[i],-1); } if(a[lr[i]][0]<l[i])--lr[i]; if(a[rl[i]][0]<l[i])++rl[i]; v[i].push_back(opt{ll[i],lr[i],1}); v[rl[i]].push_back(opt{lr[i]+1,i,1}); v[rr[i]+1].push_back(opt{ll[i],i,-1}); } for(rgi i=1;i<=n;++i){ for(opt o:v[i])upd(o); upd(opt{i+1,i+1,ans=qry(1,0,n,0,n)}); }
- 1
信息
- ID
- 6285
- 时间
- 1000ms
- 内存
- 500MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 上传者