当前位置: 首页 > news >正文

题解:DIV2 T2调错记

可惜题解通道关了,投稿到博客园吧。
洛谷题解通道 https://www.luogu.com.cn/article/lalcvs3b

闲话

赛后朋友告诉我有更简单的做法,傻了。

大致题意

给定一个序列 \(a\), 你可以进行以下两种操作:

  1. 选定一个数 \(a_i\)
  2. 若区间 \([i-L-1, i+1+L]\) 内有一个数 \(a_j\),且 \(a_i \le a_j,j \neq i\),那么就可以将 \(a_i + 1 \to a_i\)
    \(\forall i \in [1,n],a_i \ge m\) 的最小操作次数。
    其中 \(L,n,m\) 给定。

思路

很明显是贪心,不去做多的选择而已。

看到题目有无解的情况,先讨论无解。
首先,无解是不可能存在的。
口胡一下:

  • 对于任意两个数 \(a,b\)\(a \ge b\) 按照题目的操作来说,因为 \(L \ge 1\),则我们都能达到 \(a = b\) 这种情况,那么同样的,我们也可以达到 \(a,a+1\) 这两个数,因为题目中给出的可更改条件为 \(a_i \le a_j,i \neq j\),并不影响。
  • 所以对于任意两个数 \(a,b\),我们都可以让他们变成更大的数,而题目中只要求 \(\ge m\) 所以无无解情况。 (ps:其实直接提交一下就知道了。)

那我们就讨论有解情况。

以下,我们定义 \(ma\) 为最大值,\(Sma\) 为次大值。
分为以下两种情况:

  1. \(ma \ge m\) 那么我们只需要从 \(ma\) 所在的下标一点一点往左右跳就可以了。可以使用 \(4\) 个指针维护两个区间,我们扫完之后就跳出就可以,时间复杂度 \(O(n)\)
  2. \(ma < m\) 这种情况就需要我们考虑一下,又可以分为两种情况:
    1. \(ma=Sma\),此时我们肯定要先将一个数进行操作,即变为 \(ma+1, Sma\),之后,可以发现,变到 \(m\) 的最小花费一定是对于另外一个数操作 \(3\) 次,即选中,增加,增加,最后变为 \(ma+1,Sma+2\)。那么,对于最后 \(3\) 次的操作次数就是 \(m - ma - 1\),那么此时的操作次数是 \(2 + (m-ma-1) \times 3\)
    2. \(ma \neq Sma\),其操作思想相似,将两个数转变为 \(ma, Sma+1\)。其操作次数即为 \(ma - Sma + 2 +(m-ma-1) \times 3\),即将 \(Sma\) 变为 \(ma\) 之后变为 \(Sma + 1\) 所需的操作次数加上 \(3\) 次操作的操作次数。但是很明显,我们并不关心 \(ma\) 的位置,将其更改为 \(Sma\) 后重新变四个指针即可。
      之后的操作和情况 \(1\) 一样,不多赘述。

std

看这么多其实有点懵,因为我这个思路思想和实现确实有点麻烦。

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int N = 2e6 + 66;
ll a[N], n, L, m, ma, ans;
int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> L >> m;for(int i = 1;i <= n;i ++){cin >> a[i];if(a[i] > a[ma]) ma = i;}//找最大值ll l1 = ma - L - 1, r1 = ma - 1, l2 = ma + 1, r2 = ma + L + 1;if(l1 < 1) l1 = 1;if(r2 > n) r2 = n;//小心边界if(a[ma] < m){ll maa = l1;for(int i = l1;i <= r2;i ++) if(a[i] > a[maa] && i != ma) maa = i;//找次大值if(a[ma] != a[maa]){ans += a[ma] - a[maa] + 2;ans += (m - a[ma] - 1) * 3;}// ma != Smaelse{ans += 2;ans += (m - a[ma] - 1) * 3;}// ma == Smaif((m - a[ma]) & 1) swap(ma, maa), l1 = ma - L - 1, r1 = ma - 1, l2 = ma + 1, r2 = ma + L + 1;//更改ma位置a[ma] = m, a[maa] = m - 1;}if(l1 < 1) l1 = 1;if(r2 > n) r2 = n;//注意更改后的边界while(r1 > 0 || l2 < n + 1){if(l1 < 1) l1 = 0;if(r2 > n) r2 = n + 1;//这是为了防止运算越界和终止条件for(int i = l1;i <= r1;i ++) if(i >= 1 && a[i] < m) ans += m - a[i] + 1, a[i] = m;for(int i = l2;i <= r2;i ++) if(i <= n && a[i] < m) ans += m - a[i] + 1, a[i] = m;//多判断一下,注意可能多次运算,所以将其更改后的赋 mr1 = l1 - 1, l1 = l1 - L - 1;l2 = r2 + 1, r2 = r2 + L + 1;//更改两个区间}cout << ans << '\n';return 0;
}
http://www.jsqmd.com/news/423699/

相关文章:

  • 【每天学习一点算法 2026/02/28】无重复字符的最长子串
  • 解锁RAG检索增强生成:如何让大语言模型突破知识瓶颈,精准回答专业问题
  • 互联网大厂Java求职面试实录:从基础到微服务与AI技术
  • 突破3D点云分析瓶颈:PCM如何用线性复杂度的Mamba模型实现性能飞跃
  • 说说水稻育秧盘选购要点,靠谱的厂家排名如何? - 工业推荐榜
  • 细聊洛阳诚信的老旧房改造公司,派轩装饰费用怎么收费 - 工业品牌热点
  • 河北骏诺业务能力怎么样,产品好用吗,价格多少钱? - 工业设备
  • 抖音投流公司费用怎么收,广西性价比高的有哪些 - myqiye
  • 好用的桥梁伸缩缝推荐,云南靠谱的供应商有哪些 - mypinpai
  • 2026年Q1太阳能热水器选购指南:口碑与服务商深度解析 - 2026年企业推荐榜
  • MCP-B (webmcp) 支持浏览器操作的mcp协议
  • 建材行业公认的权威展会有哪些?2026五大展会全解析指南 - 匠言榜单
  • 螺栓生产厂直接供货厂家哪家口碑好,价格实惠吗 - 工业品网
  • 黑龙江辰能新能源|搭贝OA降本70%,跨企审批全搞定! - 搭贝
  • 2026做宣传片制作的公司哪家好?行业口碑之选 - 品牌排行榜
  • 2026年com域名注册多少钱?最新价格及注册指南 - 品牌排行榜
  • 微软UDOP文档理解模型:5分钟快速部署,英文文档智能分析一键搞定
  • 2026口碑好的宣传片制作公司推荐及行业解析 - 品牌排行榜
  • 不定式
  • RVC快速体验:开箱即用的AI变声器,一键部署开启语音克隆之旅
  • 2026年.cn域名注册/续费哪家便宜?高性价比平台推荐 - 品牌排行榜
  • Gemma-3-12B-IT医疗科普应用:医学术语通俗化解释与健康文案生成
  • 2026提供域名注册增值服务的公司推荐 - 品牌排行榜
  • Hunyuan翻译模型部署教程:支持33语种互译详细步骤
  • 2026国内域名注册商推荐:合规服务与性价比之选 - 品牌排行榜
  • 达摩院春联AI效果验证:人工专家评分显示文化内涵得分4.82/5.0
  • 2026无人机培训基地哪家比较专业?行业实力机构推荐 - 品牌排行榜
  • 2026年有专业团队的宣传片制作公司推荐 - 品牌排行榜
  • 2026无人机培训考证哪家费用优惠?性价比机构推荐 - 品牌排行榜
  • 2026年值得关注的模切机品牌推荐 - 品牌排行榜