每日一题——Genius ACM

news/2025/3/20 21:34:23/文章来源:https://www.cnblogs.com/PZnwbh/p/18784015

题目

Genius ACM

题解

我们这题使用倍增+归并的思想,要使平方差最大当然是离越远越好,那么自然而然会想到排序。

  1. 检查合法性函数 check(l, r)

    • 提取子数组 ( a[l:r] ) 并拷贝到数组 b 进行排序。
    • 计算前 ( m ) 对最大平方差和。
    • 如果总和小于等于 ( k ),返回 true,表示该子段可行。
  2. 倍增搜索找最优分割点

    • 采用倍增(指数增长)查找当前段能扩展到的最大右边界
      • p = 1(步长),r = l(当前右边界)。
      • check(l, r + p) 可行,则扩展 r += p,并倍增 p *= 2
      • 否则 p /= 2,进行细粒度搜索。
    • 找到最大合法段后,计数 cnt++,更新 l = r,继续下一段查找。
  3. 复杂度分析

  • check(l, r): 需要对 b 排序,复杂度为 ( O(nlog n) )。
  • 每次 while(l < n)
    • 指数倍增查找 ( O(log n) ) 次 check(l, r)
    • 整体最坏情况 ( O(n(logn)^2) )。

我们提交答案发现代码运行居然超时了,那我们该怎么进行优化呢。我们会发现对于排序片段中,有部分是上次就排序好了,我们不需要将他们再进行一次排序,只需要把后来加入的排序,最后归并一下就好了。此时优化后的代码时间复杂度就来到了O(nlogn)。

参考代码(优化前)

#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int N = 5e5 + 10;
int a[N],b[N];
int n, m, T;
bool check(int l, int r){int k = 0;for(int i = l; i < r; i ++) b[k ++] = a[i];sort(b, b + k);int sum = 0;for(int i = 0; i < m && i < k; i ++ , k --) sum += (b[k - 1] - b[i]) * (b[k - 1] - b[i]);return sum <= T;
}
void solve(){cin >> n >> m >> T;for(int i = 0; i < n; i ++) cin >> a[i];int l = 0, cnt = 0;while(l < n){int p = 1, r = l;while(p){if(r + p <= n && check(l, r + p)){r += p;p *= 2;}else{p /= 2;}}cnt ++;l = r;}cout << cnt << endl;
}
signed main(){int _ = 1;cin >> _;while(_ --){solve();}return 0;
}

参考代码(优化后)

#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int N = 5e5 + 10;
int a[N],b[N],t[N];
int n, m, T;
bool check(int l, int mid, int r){for(int i = mid; i < r; i ++) b[i] = a[i];sort(b + mid, b + r);int i = l, j = mid, k = 0;while(i < mid && j < r){if(b[i] < b[j]) t[k ++] = b[i ++];else t[k ++] = b[j ++];}while(i < mid) t[k ++] = b[i ++];while(j < r) t[k ++] = b[j ++];int sum = 0;for(int i = 0; i < m && i < k; i ++ , k --) sum += (t[k - 1] - t[i]) * (t[k - 1] - t[i]);return sum <= T;
}
void solve(){cin >> n >> m >> T;for(int i = 0; i < n; i ++) cin >> a[i];int l = 0, cnt = 0;while(l < n){int p = 1, r = l;while(p){if(r + p <= n && check(l, r, r + p)){r += p;p *= 2;for(int i = l; i < r; i ++) b[i] = t[i - l];}else{p /= 2;}}cnt ++;l = r;}cout << cnt << endl;
}
signed main(){int _ = 1;cin >> _;while(_ --){solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902223.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20244113 实验一《Python程序设计》实验报告

课程:《Python程序设计》 班级: 2441 姓名: 咸润杰 学号:20244113 实验教师:王志强 实验日期:2025年3月20日 必修/选修: 公选课 1.实验内容 (1)熟悉Python开发环境; (2)下载python与pycharm,完成python开发环境搭建; (3)编写程序,练习变量和类型、字符串、对象…

P8435 【模板】点双连通分量

P8435 【模板】点双连通分量 题目描述 对于一个 \(n\) 个节点 \(m\) 条无向边的图,请输出其点双连通分量的个数,并且输出每个点双连通分量。 输入格式 第一行,两个整数 \(n\) 和 \(m\)。 接下来 \(m\) 行,每行两个整数 \(u, v\),表示一条无向边。 输出格式 第一行一个整数…

SqlServer 中行转列PIVOT函数用法

SqlServer 中行转列PIVOT函数用法 前言 最近在面试的时候,碰到了手写sql的题目,这让我这个面向AI的程序员着实难看。只见我面露难色,绞尽脑汁的情况下,终于还是放弃了。 这道题目不难,但是由于平时几乎没有遇到行转列的情况,导致在手写时忘记了PIVOT函数怎么使用😩。 面…

第五周第四天

所用时间:180分钟 代码量(行):15 博客量(篇):1 了解到的知识点: 1.matplotlib的配置 因为要参加数学建模大赛,今天配置了python和matplotlib环境,尝试运行了程序,代码如下: import matplotlib.pyplot as plt import numpy as np# 生成数据 x = np.linspace(0, 10, …

Vue3中使用TinyMce编辑器

Vue3中使用TinyMce编辑器 - 知乎 一,安装TinyMce富文本vue npm install @tinymce/tinymce-vue -S npm install tinymce -STinyMce本身是英文编辑器,所以还需要下载中文本地化文件:https://www.tiny.cloud/get-tiny/language-packages/下载完成后放入node_modules下的tinymce…

入门Dify平台:如何根据需求选择与创建最合适的应用

今天我们将继续深入讲解Dify,重点介绍如何创建应用。具体来说,我们将探讨如何根据不同的需求来决定选择什么类型的应用最为合适,帮助大家更好地理解在Dify平台上构建应用的最佳实践。 创建空白应用 首先,我们需要进入Dify的首页选择工作室,并创建空白应用。如图所示:点击…

月暗推出音频模型 AudioX:任意内容生成音频和配乐;开源 TTS 模型 Orpheus,可生成叹息、笑声等非文本线索丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

202110211215 - IT项目管理笔记

IT项目管理中的百慕大 资源 、范围、进度 三角平衡 项目管理 -- 做事 启动、规划、执行、控制、收尾 项目管理 -- 四个层次: 复杂的事情简单化:分解 简单的事情量化:临界值 量化的事情专业化:规律 专业的事情模板化:框架模板 项目: 为创造特定产品或服务的一项有时限的任…

k8s拉取私有镜像的2种方式

k8s 在拉取私有镜像时 ,传递认证信息目录通过secret通过ServiceAccount 通过secret01-image-pull.yamlkind: Pod apiVersion: v1 metadata:name: imagepull-nginxlabels:group: imagepull spec:containers:- name: nginximage: registry.cn-beijing.aliyuncs.com/hkui_dev/ngi…

202110111235 - 软件工程笔记

1. 概述 1.1 开发只占冰山一角 1.2 计算机科学、数学,工程,管理 1.3 软件开发的本质:实现问题域中的概念和处理逻辑 到 运行平台的概念和处理逻辑的映射。系统建模 需求 -> 设计 -> 实现1.4 软件工程的目标:生产具有正确性、可用性、以及开销合宜的产品。 1.5 软件工…

202109060657 - hadoop架构和读写流程

1. 整体架构 hdfs架构zkmonode高可用。HA的工作原理?是否需要每个datanode监听zk?namenodeNameNode(nn):Hdfs集群的管理者,Master 管理Hdfs的名称空间(NameSpace) 维护副本策略 记录文件块(Block)的映射信息 负责处理客户端读写请求datanodeDataNode:NameNode下达命令,…

基于风险的完整性和检查建模(RBIIM)MATLAB仿真

1.程序功能描述 基于风险的完整性和检查建模(Risk-Based Integrity and Inspection Modeling ,RBIIM)MATLAB仿真,对比prior density,posterior perfect inspection,posterior imp inpection,cummulative posterior imperfect inspection四个指标。 2.测试软件版本以及…