CF1859

A

c 保存数组中所有最大的数,如果所有数都相等则 1

B

只需要记录每个序列的最小值和次小值,然后对次小值求前后缀和。

C

枚举最大值 mx,然后遍历 i:n1。对于 i,取最大数 x 满足 x 未选且 i×xmx

证明:假设 i 原本与 x 匹配,现在与 x1 匹配,显然 x1<x,否则 ix1>mxxi1 匹配,i1<i 因为更晚选。交换 x,x1 后总和增加 (ii1)(xx1)>0,并且此时最大值依旧为 mx

D

将每个 bi,xj,li 视作一个 “事件” 存到数组里,按坐标排个序,从最右边的位置向左遍历,在数轴上做类似扫描线的操作。(扫描点?)

定义 ansi 为第 i 条线段最远能跳多远,pj 为询问 xj 的答案,显然 pj=max(xj,ansi|lixjri)

如果当前遇到了一个 bi,更新 ansi 为当前集合中所有 ans 的最大值(最靠右的),同时把 ansi 加入集合中。

如果当前遇到了一个 xj,更新 pj 为当前集合中所有 ans 的最大值,再和 xjmin

如果当前遇到了一个 li,从集合中删除 ansi

可以用 set 维护。

E

dp[i][j] 表示前 i 个数里选的区间长度和为 j 的最大价值。

dp[i][j]=max(dp[i1][j],dp[il][jl]+cost(il+1,i)|1lj).

cost(il+1,i) 就是区间 [il+1,i] 的价值。

观察发现 cost(l,r)=|blar|+|bral| 始终等于 max(blar+bral,bl+ar+bral,blarbr+al,bl+arbr+al).

同时,我们发现 dp 值之间只有 ij 不变才能更新。

我们可以维护四个数组:mn1[x],mx1[x],mn2[x],mx2[x],分别表示要求 ij=x 时,dp[i][j]+bi+ai 的最小值,dp[i][j]+bi+ai 的最大值,dp[i][j]+biai 的最小值,dp[i][j]+biai 的最大值。

然后我们求 dp[i][j] 的时候,就可以根据 ij 调用四个数组,根据上面 cost 的公式加减一下,四种情况都取 max。大幅优化。

F

posted @   FLY_lai  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示