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

S0037. Genius ACM

S0037. Genius ACM

题意

给定一个整数 \(M\),对于任意一个整数集合 \(S\),定义“校验值”如下:

从集合 \(S\) 中取出 \(M\) 对数(即 \(2 \times M\) 个数,不能重复使用集合中的数(如果 \(S\) 中的整数不够 \(M\) 对,则取到不能取为止),使得“每对数的差的平方”之和最大,这个最大值就称为集合 \(S\) 的“校验值”。

现在给定一个长度为 \(N\) 的数列 \(A\) 以及一个整数 \(T\)。我们要把 \(A\) 分成若干段,使得每一段的“校验值”都不超过 \(T\)。求最少需要分成几段。

思路

贪心

假设现在只有四个数 \(a\)\(b\)\(c\)\(d\)\(a \le b \le c \le d\))。

则有三种情况:

  • \(a\)\(b\) 一组,其余一组(因为递增,所以一定非最优)。
  • \(a\)\(c\) 一组,其余一组。
  • \(a\)\(d\) 一组,其余一组。

后两组”每对数的差的平方之和“的差为:

\[(c - a) ^ 2 + (d - b) ^ 2 - (d - a) ^ 2 - (c - b) ^ 2 = (c ^ 2 - 2ac + a ^ 2) + (d ^ 2 - 2bd + b ^ 2) - (a ^ 2 - 2ad + d ^ 2) - (c ^ 2 - 2bc + b ^ 2) \\ = 2ad + 2bc - 2ac - 2bd \\ = 2a(d - c) + 2b(c - d) \\ = 2(b - a)(c - d) \]

LaTex好难用

于是我们发现,\((b - a) > 0\)\((c - d) < 0\)

也就是说,\(a\)\(d\) 一组一定优于 \(a\)\(c\) 一组。

同理可得,我们要将最大的 \(A_i\) 和最小的 \(A_i\) 配对,次大的 \(A_i\) 和次小的 \(A_i\) 配对,以此类推。

倍增

我们发现二分有一点浪费了,所以我们很容易想到倍增。

由于右端点可能只移一小段,但二分却直接移了一大段,十分浪费。

步骤:

  1. 新建倍增变量 \(bz\) 和当前的左右端点 \(L\)\(R\)
  2. 求出 \(L\)\(R + bz\) 这一段的校验值 \(k\),若 \(k \le T\),则 \(R = r + bz\)\(bz = 2bz\),否则 \(bz = \cfrac{bz}{2}\)
  3. 重复第二步,直到 \(bz \lt 0\),此时 \(R\)\(L\) 对应的最优右端点。

时间复杂度是高贵的 \(\mathcal{O}(n\log ^ 2 n)\),似乎过不了?

我们还可以优化。

归并排序

其实只是归并排序的思想

在归并排序中,我们添加三个参数 \(l, mid, r\),分别是刚刚的 \(L, R, R + bz\),此时由于上一次处理时 \(l\)\(mid\) 已经排了序了,所以我们只用排 \(mid\)\(r\) 归并,然后利用归并排序的思想,把 \(l\)\(mid\)\(mid\)\(r\) 归并最后判断答案是否满足 \(ans \le T\)

时间复杂度

\(\mathcal{O}(n \log n)\)

代码

#include <bits/stdc++.h>
#define int long long
#define itn int
#define fro for
using namespace std;
const int N = 5e5 + 10;
int t;
int n, m, k, p[N];
int a[N], b[N];
bool ms(int l, int mid, int r){//归并排序for(int i = mid; i < r; i++){a[i] = p[i];}sort(a + mid, a + r);int nl = l, nr = mid, cnt = 0, ans = 0;while(nl < mid && nr < r){if(a[nl] <= a[nr]) b[cnt++] = a[nl++];else b[cnt++] = a[nr++];}while(nl < mid) b[cnt++] = a[nl++];while(nr < r) b[cnt++] = a[nr++];for(int i = 0; i < m && i < cnt; i++, cnt--){//处理答案ans += (b[i] - b[cnt - 1]) * (b[i] - b[cnt - 1]);}return ans <= k;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> t;while(t--){cin >> n >> m >> k;for(itn i = 0; i < n; i++){cin >> p[i];}int s = 0, e = 0;//L和Rint cnt = 0;while(e < n){int bz = 1;while(bz > 0){//倍增if(e + bz <= n && ms(s, e, e + bz)){e += bz;bz <<= 1;if(e >= n) break;for(int i = s; i < e + bz; i++){a[i] = b[i - s];}}else bz >>= 1;}cnt++;s = e;}cout << cnt << '\n';}}
http://www.jsqmd.com/news/365968/

相关文章:

  • 2026年降AI率后论文被导师打回?可能是语义丢失惹的祸
  • 2026年激光标签机推荐榜单:技术精度与行业适配双维度评估的行业指南 - 品牌推荐
  • 2026全球车载照明灯市场格局:技术迭代与厂商竞争分析 - 品牌推荐大师1
  • 2026年降AI率后原文面目全非?这样改才能形变意不变
  • 2026 哈尔滨英语雅思培训教育机构推荐;雅思培训课程中心权威口碑榜单 - 老周说教育
  • 2026年降AI率后怎么检查原意有没有丢?3步自查法
  • 2026年降AI率工具会改变原意吗?实测5款后发现这个规律
  • 智慧学工育人生态综合解决方案
  • 2026年标记机推荐:智能制造趋势评测,涵盖新能源与总装场景标记痛点 - 品牌推荐
  • 2026年论文降AI率工具哪个最保原意?4款实测对比
  • 智慧学生服务平台 - 学生管理服务与培养专家
  • 2026年降AI率后论文逻辑断裂怎么办?修复指南来了
  • 2026年讲讲八维通科技智能停车合作案例情况如何 - 工业推荐榜
  • 细聊体育西小学附近好吃的白切鸡餐厅,口碑好的推荐给你 - 工业品网
  • C++ STL 学习笔记(一):vector 去重的三种实现方法详解
  • 2026年降AI率保持原意的底层逻辑:为什么换词不如换结构
  • 2026年河北接地端子制造厂排名,技术强且售后好的品牌推荐 - 工业品网
  • 2026年降AI率保持原意的最大误区:不是每句话都要改
  • 2026年2月打标机品牌综合评估与选型指南 - 品牌推荐
  • 亲历AI浪潮5年:技术更新快,但掌握底层逻辑永远有价值
  • Alibaba Cloud Linux 是免费镜像
  • 面试官:ArrayList和LinkedList有什么区别?
  • 面向削峰填谷的电动汽车多目标优化调度策略:MATLAB 实现之旅
  • 2026年毕业论文降AI率怎么保持原意?学长踩坑经验分享
  • 教师人事系统:让教职工管理更轻松高效
  • macOS Catalina 10.15.8 (19H2036) 发布
  • 2026年答辩前降AI率怎么保持论文原意?紧急情况处理方案
  • 2026年2月中国打标机服务商发布:以济南中正金码为代表的标杆企业深度解析 - 品牌推荐
  • 在开始域渗透之前,先来简单了解下域的一些概念
  • 从0到1详解SpringBoot代码案例,阿里SpringBoot王者晋级之路真香