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

AtCoder-abc407_e解析

时隔一年,我又来了!

题目链接

让我们一步一步详细分析这个问题:

  1. 基本性质分析:

    • 题目给出的序列由n对括号组成,意味着总长度为2n
    • 根据括号匹配规则,序列首项必须是左括号'(',末尾必须是右括号')'
    • 因此我们可以确定第1项为'(',第2n项为')',这是构建合法序列的基础
  2. 构建策略:

    • 采用逐项构建的方法,每次考虑添加2个值(1对括号)
    • 对于中间的位置选择(第2到第2n-1项),需要保证:
      • 在任何前缀中,左括号数量≥右括号数量
      • 最终左括号总数等于右括号总数
    • 为了满足这些条件,可以使用贪心算法:
      • 维护当前可用的左括号和右括号数量
      • 每次选择时优先选当前可用的最大字符
  3. 优化实现:

    • 直接排序每次可选字符的时间复杂度为O(n^2 logn)
    • 使用最大堆(优先队列)优化:
      • 初始化时将n-1个左括号和n-1个右括号放入堆中
      • 每次取出堆顶的最大元素作为当前选择
      • 选择后更新可用括号数量
    • 堆操作的时间复杂度为O(n logn),显著优于排序方法
  4. 具体步骤示例: a) 固定首位为'(',末位为')' b) 初始化最大堆:加入n-1个'(', n-1个')' c) 循环2n-2次: i. 取出堆顶元素 ii. 添加到序列中 iii. 更新剩余括号计数 d) 最后添加')'完成序列

  5. 合法性验证:

    • 在整个构建过程中:
      • 始终保持左括号总数≥右括号总数
      • 最终两者数量相等
      • 堆的优先选择机制确保字典序最大

这种通过堆优化的贪心算法,既能保证生成合法括号序列,又能高效地得到字典序最大的结果。

上代码:

#include<bits/stdc++.h>
using namespace std;
long long t,n,a[400010];
int main(){cin>>t;while(t--){cin>>n;for(int i=1;i<=2*n;i++) cin>>a[i];long long sum=a[1];priority_queue<long long> h; for(int i=2;i<=2*n-1;i++){h.push(a[i]);i++;h.push(a[i]);sum+=h.top();h.pop();}cout<<sum<<endl;}return 0;
}

最后提醒一句:一定要开long long!!

求关注。

http://www.lqws.cn/news/124057.html

相关文章:

  • 在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
  • 第五期书生大模型实战营-《L1G1-玩转书生大模型 API 之 Browser-Use 实践》
  • 【多线程初阶】wait() notify()
  • 那些Java 线程中断的实现方式
  • 如果安装并使用RustDesk
  • window 显示驱动开发-提供视频解码功能(三)
  • GO语言---函数命名返回值
  • React从基础入门到高级实战:React 高级主题 - 测试进阶:从单元测试到端到端测试的全面指南
  • 深入详解开源工具DCMTK:C++开发的DICOM工具包
  • 更新 Docker 容器中的某一个文件
  • Java Stream 高级实战:并行流、自定义收集器与性能优化
  • 机器学习监督学习sklearn实战三:八种算法对印第安人糖尿病预测数据进行分类和比较
  • 基于对比学习的带钢表面缺陷分类研究,整合SimCLR自监督预训练与YOLOv8目标检测框架的技术解析及Python实现方案
  • 每天总结一个html标签——Audio音频标签
  • SOC-ESP32S3部分:30-I2S音频-麦克风扬声器驱动
  • 图像处理、图像分析和图像理解的定义、联系与区别
  • 【Pandas】pandas DataFrame reset_index
  • Delphi用if else实现 select case、switch语句功能,实现case 以字符串为分类条件。
  • AI IDE 正式上线!通义灵码开箱即用
  • (T/SAIAS 020-2024)《医疗大模型语料一体机应用指南》深度解读与实施分析
  • echarts使用graph、lines实现拓扑,可以拖动增加effect效果
  • Duix.HeyGem:以“离线+开源”重构数字人创作生态
  • 【运维实战】使用Nvm配置多Node.js环境!
  • Git安装与常用命令全攻略
  • C#编程过程中变量用中文有啥影响?
  • Zookeeper 集群部署与故障转移
  • C#和C++在编译过程中的文件区分
  • 【Web应用】若依框架:基础篇14 源码阅读-后端代码分析-课程管理模块前后端代码分析
  • ubuntu自定义服务自动启动
  • 全志A40i android7.1 调试信息打印串口由uart0改为uart3