【学习笔记】[AGC040E] Prefix Suffix Addition

首先对贡献进行一个基本的转化,设 A i = B i + C i A_i=B_i+C_i Ai=Bi+Ci,答案是 ∑ [ B i > B i + 1 ] + ∑ [ C i < C i + 1 ] \sum [B_i>B_{i+1}]+\sum [C_i<C_{i+1}] [Bi>Bi+1]+[Ci<Ci+1]

d p i , j dp_{i,j} dpi,j表示 B i = j B_i=j Bi=j时的最小代价,我们从两个角度压缩状态。

1.1 1.1 1.1 ∣ d p i , 0 − d p i , A i ∣ ≤ 2 |dp_{i,0}-dp_{i,A_i}|\le 2 dpi,0dpi,Ai2 ,显然,因为这一步最多产生 2 2 2的贡献,也就是说值域是稠密的。
1.2 1.2 1.2 d p i , j dp_{i,j} dpi,j单调递减。

上述性质不难通过打表看出。并且 j j j固定时, k k k越大,转移代价越大,所以我们大力维护这个分段函数即可。

复杂度 O ( n ) O(n) O(n)。注意如果 B B B的后缀是 0 0 0或者 C C C的前缀是 0 0 0时会多算贡献,需要处理一下边界。

#include<bits/stdc++.h> #define ll long long using namespace std; int n,a[200005]; int x,y,dp; signed main(){ cin>>n;for(int i=1;i<=n;i++)cin>>a[i]; y=a[1]; for(int i=2;i<=n;i++){ int l1=max(y,a[i]-a[i-1]+y); // 代价为0 int l2=min(y,a[i]-a[i-1]+y); // 代价为1 int l3=max(x,a[i]-a[i-1]+x),l4=min(y-1,a[i]-a[i-1]+y-1); int X=0,Y=0; if(l1>a[i]){ dp++,Y=l2; if(l3<=l4)Y=l3; } else { Y=l1,X=l2; if(l3<=l4)X=l3; } x=max(X,0),y=max(Y,0); }if(y==0)dp--; cout<<dp+1; }

__EOF__

本文作者仰望星空的蚂蚁
本文链接https://www.cnblogs.com/cqbzly/p/17530046.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示