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

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

题意

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

思路

三分

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

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

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

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

再思考发现每个点对于选定点的距离加权值函数都是一个 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

http://www.rkmt.cn/news/89251.html

相关文章:

  • 代码源挑战赛 Round 41
  • 详细介绍:NumPy / pandas 类型选型、内存占用与性能优化
  • 告别选择困难!2025年远程控制软件场景化终极横评
  • 青少年编程学习:考级与竞赛如何平衡
  • 2025 Autel MaxiVCI V150 Wireless Dongle: CAN FD/DOIP for Autel 900 Series Scanners
  • 【题解】Luogu P8269 [USACO22OPEN] Visits S
  • Ubuntu环境中LLaMA Factory 的部署与配置—构建大语言模型微调平台 - 实践
  • WSL安装方法
  • 【题解】P11453 [USACO24DEC] Deforestation S
  • 【dl】【WSL2】如何获得“Winux”?Windows 上的 Linux 子系统 —— 比虚拟机更好的选择
  • CSS3动画:2D/3D转换全解析
  • P2014 [CTSC1997] 选课
  • 彻底讲清 MySQL InnoDB 锁机制:从 Record 到 Next-Key 的全景理解
  • MCU的启动流程你了解么?
  • I2C通信最全面的讲解:从协议到硬件设计
  • 【题解】Luogu P10752 [COI 2024] Sirologija
  • Python字符串:别只用来打印!这5个高级用法让代码效率翻倍
  • 【题解】Atcoder ABC432 C
  • 赶due党救急!论文降重2小时搞定,不熬夜
  • 计算机论文模板推荐:8大平台+AI修改工具
  • 期待回家,顺便写点年度总结
  • E No address added out of total 1 resolved地址绑定失败: No address added out of total 1 resolved errors:
  • JavaScript 异常原因(Error Cause):实现分布式系统错误链追踪的序列化与反序列化
  • JavaScript 记录(Records)与 元组(Tuples):实现堆内存中不可变复合数据结构的内存布局
  • 线程并发编程,同步与互斥机制
  • Python列表与元组:搞懂这3个核心差异,再也不纠结用哪个
  • MQ消息队列相关知识与对比
  • 完整教程:PPT导出为图片的格式选择:JPG与PNG的区别
  • 代码随想录算法训练营第三十二天 | 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、卡码网57. 爬楼梯
  • 基于深度学习的文物图像修复系统