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

题解:【MYCOI R1】好想大声说爱你

题目传送门

在场上被骗了,最后才写出来,遂有此题解。

题意分析

记原题面中 \(L,M\) 分别为 \(l,m\)

如果无解则输出 Che_is_Loser

然而你发现似乎怎样都有解,实际上也是如此……也许只有我在这里停了。

但是在 IOI 赛制下,其实你可以直接交一发就可以知道没有无解了。

我们的目标是让 \(a_1,a_2,\cdots,a_n\) 都增长到 \(m\)。那么对于每一个 \(a_i<m\),对答案的贡献至少\(m-a_i+1\)。因为你至少选择 \(1\) 次,再每次增长 \(1\)

  • 容易想到如果存在 \(a_x\geq m\)无论 \(l\) 为何值,你始终有一种最优策略,即从 \(x\) 向两边扩展。实际上的操作次数也就是:

    \[\textit{cnt}+\sum_{i=1}^n\max(m-a_i,0) \]

    \(\textit{cnt}\) 表示 \(a_i<m\) 的数量。

    这个策略是最优的,因为这就是上文的下界

  • 对于不存在 \(a_x\geq m\) 的情况,考虑贪心。

    不难发现 \(\displaystyle\sum_{i=1}^n\max(m-a_i,0)\) 的贡献是不可避免的,因此总次数最小当且仅当每一个点被重复选择的次数最小。

    • 如果构造出了 \(a_x\geq m\),则剩余的每一个点的选择次数都为 \(1\),最优。

    • 如果不是先构造 \(a_x\geq m\),则不优。

      证明也比较简单。你肯定会有一个点 \(y\) 是最先达到 \(m\) 的,之后你就可以从 \(y\) 开始扩展。但是如果除了 \(y\) 之外你还使 \(z\) 增长,那么之后 \(y\) 扩展的时候又要选择一次 \(z\)\(z\) 被重复选择,不优。

    因此思路就很简单:用最少的选择次数构造一个 \(a_x\geq m\)。不难想到选择 \(a\)最大值来构造。

    对于最大值 \(a_x\),取其相邻项 \(a_y\)。(\(y=x\pm1\)

    先选择 \(a_y\),再令其增长 \(a_y\leftarrow a_x+1\)。这一次对于答案的贡献为 \(a_x+1-a_y+1\)

    之后就是 \(a_x\leftarrow a_y+1\),再 \(a_y\leftarrow a_x+1\),重复循环。

    每次对于答案的贡献为 \(3\)\(a_x\)\(a_y\) 增长 \(2\)

    得到了 \(a_x=m\) 之后,继续扩展即可。

时间复杂度 \(\mathcal O(n)\)

AC 代码

//#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<ctime>
#include<deque>
#include<queue>
#include<stack>
#include<list>
using namespace std;
typedef long long ll;
#define int ll
constexpr const int N=1e6;
int n,l,m,a[N+1],d[N+1];
int left_max[N+1],right_max[N+1];
int ans;
main(){/*freopen("test.in","r",stdin);freopen("test.out","w",stdout);*/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];}ll sum=0;int cnt=0;bool vis=false; for(int i=1;i<=n;i++){d[i]=max(0ll,m-a[i]);sum+=d[i];if(d[i]>0){cnt++;}if(a[i]>=m){vis=true;}}if(sum==0){cout<<"0\n";return 0;}if(vis){cout<<sum+cnt<<'\n';return 0;}int Max=a[1],x=1;for(int i=1;i<=n;i++){if(a[i]>Max){Max=a[i];x=i;}}int ans=0,y=x+1;if(y>n){y=x-1;}ans+=1+a[x]+1-a[y];a[y]=a[x]+1;while(a[y]<m){swap(x,y);a[y]+=2;ans+=3;}sum=0;cnt=0;for(int i=1;i<=n;i++){d[i]=max(0ll,m-a[i]);sum+=d[i];if(d[i]>0){cnt++;}}ans+=cnt+sum;cout<<ans<<'\n';cout.flush();/*fclose(stdin);fclose(stdout);*/return 0;
}
http://www.jsqmd.com/news/421828/

相关文章:

  • 2026免疫力护城河怎么建?与其等“生病救火”,不如把“养身”做成日常工程 - 品牌企业推荐师(官方)
  • 2026免疫力黑马榜重磅发布:摆脱“疲惫循环”、加速恢复,直面“免疫赤字”的硬核解法 - 品牌企业推荐师(官方)
  • 【2026年综合测评】深圳猎头公司哪家好?哪家值得推荐?以及联系方式是多少? - 品牌企业推荐师(官方)
  • 计算机毕业设计springboot公共法律服务平台的设计与实现 基于SpringBoot的智慧法务在线服务与咨询系统 SpringBoot框架下数字化法律援助与资源管理平台
  • 2026免疫力“逆龄”全攻略:别等生病才补救,把“养身”做成你的日常优势 - 品牌企业推荐师(官方)
  • 2028全球智能危机:当AI发展得太快
  • 张家口代理记账公司电话【张家口玉算盘会计服务有限公司】 - 品牌企业推荐师(官方)
  • 计算机毕业设计springboot公考备考网站 基于SpringBoot的公务员考试在线学习与交流社区平台 SpringBoot框架下公职考试智能备考与知识管理系统
  • 计算机毕业设计springboot工业mro耗材采购平台 基于SpringBoot的工业运维物资数字化采购管理系统 SpringBoot框架下MRO工业品供应链协同服务平台
  • 计算机毕业设计springboot公交司乘人员管理与排班系统设计 基于SpringBoot的城市公交驾驶员智能调度与培训管理系统 SpringBoot框架下公共交通乘务人员信息化排班与绩效评价平台
  • SQL 核心概念:JOIN 和 UNION 到底有什么区别?
  • 联发科旗舰新料MT9681(MT9655,Pentonic 800),支持升级Android16,3840*2160标准4K@165hz高刷,3840*2400(16:10)特殊分辨率显示方案
  • 回收永辉超市卡前必读清单,让闲置卡券焕发新生 - 京顺回收
  • png图片在windows电脑可以大图预览,画图工具打开也可以查看,浏览器打开却无法显示
  • 【开题答辩全过程】以 购物网站设计与实现为例,包含答辩的问题和答案
  • 【开题答辩全过程】以 桂电校园运动会管理系统为例,包含答辩的问题和答案
  • 千万不能错过!山西运城这几家品牌策划公司真的太牛了!
  • 兰亭妙微作品一某汽车品牌网站设计 - ui设计公司兰亭妙微
  • CATIA VBA脚本报错:Automation error Unspecified error
  • springMVC - 拦截器与全注解开发
  • 为什么开发还原UI总是差一点?UI生成代码与鸿蒙ArkUI开发技巧
  • SparseConv原理
  • GDKOI J 幸福指数 补题记录
  • 玩转西门子S7-1200:从零到实战的硬核指南
  • Mise 是一种好软件
  • 2026年北京发电机租赁推荐厂家:大型发电机、静音发电机、柴油发电机、发电车、UPS应急电源 - 海棠依旧大
  • SimuRTS提供完整HIL测试解决方案!
  • Flutter 真机 Debug 报 VM Service 连接失败(Android / iOS 通用)— 代理环境变量导致
  • 体验凯云SimuRTS+研华HIL实时机,助力项目快速落地
  • 解决MI50在Ollama0.17.4无法运行最新的Qwen3.5模型的问题