尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【题解】Luogu P11854 [CSP-J2022 山东] 宴会

【题解】Luogu P11854 [CSP-J2022 山东] 宴会
📅 发布时间:2026/6/20 4:37:24

题意

求一个点,使得数轴上所有点到一个点的距离加上其权值的最大值最小。

思路

三分

当选定点在所有点左侧时,距离最大值较大。

向右移动该点,最大值减小。

在所有点右侧时,最大值也较大。

由此可推测该最大值是一开口向上的单峰函数,在中间某个点取最小。

再思考发现每个点对于选定点的距离加权值函数都是一个 V 字形折线,而所求函数是每个点上所有函数的最大值构成的图像,对每种相交情况分类讨论即可得出目标函数也是一个由折线构成的单峰函数。

三分求解,复杂度 \(O(T \times n\log X)\),其中 \(X\) 是 \(x_i\) 中的最大值。

转化

在选择 \(x_0\) 作为目标点时,\(x_0\) 左侧所有点都相当于向左移动了 \(t_i\),使得距离加大了权值。同理,右侧所有点都相当于向右移动了 \(t_i\)。

此时最优的目标点是最小坐标与最大坐标的中点。

因此可以判断 \(x_0\) 在每相邻两个点之间的情况(需要先按坐标排序)。如果该情况下最优点也在这两个点之间,则假设成立。统计出所有成立假设下的最小值。

朴素做法每次重新计算坐标,\(O(n^2)\) 复杂度不可接受。所以要预处理所有点向左移动情况下的前缀最小值和所有点向右移动情况下的后缀最大值。当选定 \(x_0\) 在 \(i\) 和 \(i+1\) 两点之间时,左侧最小坐标一定是 \(i\) 点的前缀最小,右侧最大坐标一定是 \(i+1\) 点的后缀最大。

考虑样例中特殊情况:一些点坐标相等。此时计算出的中点可能会偏移最优点。此时只需要把答案初始值设为坐标点,由于偏移的值不可能更优,自然可以规避错误。

while(T--){scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i].p);for(int i=1;i<=n;i++) scanf("%d",&a[i].t);sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){pre[i]=a[i].p-a[i].t;if(i>1) pre[i]=min(pre[i-1],pre[i]);} for(int i=n;i>=1;i--){lst[i]=a[i].p+a[i].t;if(i<n) lst[i]=max(lst[i+1],lst[i]);}double mins=1000000010,tp=a[1].p; for(int i=1;i<n;i++){double mid=(pre[i]+lst[i+1])*1.0/2;if(a[i].p<=mid&&mid<=a[i+1].p){if(mid-pre[i]*1.0<mins){mins=mid-pre[i]*1.0;tp=mid;}}}int q=tp;if(1.0*q==tp) printf("%d\n",q);else printf("%.1lf\n",tp);}

优化

更进一步不难想到,目标点选在向左平移后坐标最小点的左边,和向右平移后坐标最大点的右边一定不优。所以它们在上述算法中必然会贡献最小值和最大值。因此省去遍历,预处理后直接求解即可。

while(T--) {cin>>n;for(int i=1; i<=n; i++) cin>>a[i];maxx=-1000000007,minn=1000000007;for(int i=1; i<=n; i++) {cin>>x;maxx=max(maxx,a[i]+x);minn=min(minn,a[i]-x);}ans=(maxx+minn)/2.0;if(floor(ans)==ans) printf("%d\n",(int)ans);else printf("%.1f\n",ans);}

(代码来自题解)

重题:Codeforces 1730B

相关新闻

  • 代码源挑战赛 Round 41
  • 详细介绍:NumPy / pandas 类型选型、内存占用与性能优化
  • 告别选择困难!2025年远程控制软件场景化终极横评

最新新闻

  • 深入解析MCU串口通信:从SCI寄存器配置到LIN、RS-485实战应用
  • 关于我的这片小天地
  • 2026年6月实习管理系统品牌哪个好,实习管理平台/实习系统/实习管理系统,实习管理系统公司在哪找 - 品牌推荐师
  • SQL经典实例——分层查询
  • C++虚函数与运行时多态
  • MC68HC908GZ ESCI模块深度解析:寄存器操作、波特率配置与调试实战

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号