CF1852C

题意

给定 K

给出长为 N 的序列 a0ai<K

你可以先进行以下预操作若干次:aiai+K

定义 rock(l,r) 操作为 i[l,r],aiai1

对你进行操作后的数列,求最小的 rock 操作次数,使 i,ai=0

sample: K=3
1 2 0 1 0 2 1
预操作后为
1 2 3 4 3 2 1
答案为 4

题解

若不能进行预操作,则为经典问题。

定义 daa 的差分序列,得 ans=i=1Nmax(dai,0)

直接考虑差分序列。增量考虑:

记当前数为 x,上一个是 y

xy,则此处贡献要么为 0,要么为 x+Ky

x>y,则此处贡献为 xy

考虑当前的所有贡献,直接压进堆里,当 x>y 时取出最小的即可。

//pq 为 priority_queue 实现小根堆
scanf("%lld%lld",&N,&K);
while(N--){
ll x;
scanf("%lld",&x);
//if(x==K) x=0;
if(x>be){
pq.push(x-be);
ans+=pq.top();
pq.pop();
}else{
pq.push(K+x-be);
}
be=x;
}
printf("%lld\n",ans);
posted on   Zaunese  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?



点击右上角即可分享
微信分享提示