CF1693F题解

news/2024/11/15 11:59:03/文章来源:https://www.cnblogs.com/Nekopedia/p/18372876

备注

发表时间:2023-06-17 21:51

前言

yny 学长来 cdqz 讲课,写一篇讲课的题的题解纪念一下。

题意

给你一个 01 序列,有以下操作:

  • 选择一段区间
    \(cnt_0,cnt_1\) 分别表示该区间中 01 的数量。
    花费 \(|cnt_0-cnt_1|+1\) 的代价对区间进行升序排序。

求最小代价。

思路

肯定是使每次操作的区间中 01 个数差越小越好,所以考虑每次都选择尽可能长01 个数差最小的区间。

如果最前面一段都是 0,那就不用管前面。相当于每次都从第一个 1 开始考虑(注意不是操作区间的左端点)。

题解

因为每次操作必须\(cnt_0 = cnt_1\) 才最优。
所以现在考虑如何找最优区间。
为了简化思维,我们可以先只考虑整个序列 01 多时如何求解,因为这样我们可以加 0 进行贪心。

弱化版

首先每次从区间最左端的 1 开始考虑,我们可以贪心去找最优区间。
因为 0 永远比 1 多,所以如果后面的 0 少了可以直接从前面拿 0 来补齐。
所以现在问题就在如何求最优区间。

此时,本题最妙的点来了。我们可以给 01 赋值为 \(1\)\(- 1\),将这个区间的变化用图表示。

我们假设要找序列 \(S_l\) 的最优区间右端点 \(S_r\),就可以在图中做一条与横轴平行的直线。

其中曲线与直线最右端的交点就是 \(S_r\)
而图中的曲线就只用记录与直线 \(y = i \left \{i \in [1,n] \mid i \in Z^+\right \}\) 的最右端交点。

最后,如何将方法一般化呢?

我们可以将原来 01 多的序列变成上面这种特殊序列。
因为原序列中 1 要移到后面、0 要移到前面,所以其实我们只用将原序列翻转,再给 0 1 都取反就行了(读者可自行思考)。

注意

  • 特判序列是否已为升序。

  • 01 赋值。

代码

/** @Author: H.F.Y* @Date: 2023-06-17 16:40:55* @Last Modified by: H.F.Y* @Last Modified time: 2023-06-17 17:41:39*/
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 5;
int n, a[N], pre_max[N];
char c[N];
signed main(){//freopen(,stdin);//freopen(,stdout);ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin >> T;while(T--){cin >> n; int cnt1 = 0, cnt0 = 0;memset(pre_max, 0, sizeof pre_max);memset(a, 0, sizeof a);for(int i = 1; i <= n; ++i){cin >> c[i]; a[i] = ((c[i] - '0') ? 1 : - 1);if(a[i] == 1)++cnt1;else ++cnt0;}bool opt = true;for(int i = n - 1; i; --i)if(a[i] > a[i + 1])opt = false;if(opt){cout << 0 << '\n';continue;}if(cnt1 == cnt0){cout << 1 << '\n';continue;}else if(cnt1 > cnt0){swap(cnt1, cnt0);for(int i = 1; i <= n; ++i)a[i] = ((c[n - i + 1] - '0') ? - 1 : 1);}for(int i = 1, sum = 0; i <= n; ++i){sum -= a[i];if(~ sum)pre_max[sum] = i;}int ans = 1, i = 0, cnt = cnt0 - cnt1;while(a[i + 1] == - 1 and i < n)++i;while(i < cnt){++ans;int t = pre_max[i] - i + 1; t /= 2;i += t;}cout << ans << '\n';}return 0;
}

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

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

相关文章

DDD建模后写代码的正确姿势(Java、dotnet双平台)

本文书接上回《一种很变态但有效的DDD建模沟通方式》,关注公众号(老肖想当外语大佬)获取信息:最新文章更新;DDD框架源码(.NET、Java双平台);加群畅聊,建模分析、技术交流;视频和直播在B站。终于到了写代码的环节 如果你已经阅读过本系列前面的所有文章,我相信你对需…

JetBrains RustRover 2024.2 (macOS, Linux, Windows) - 面向 Rust 开发者的强大 IDE

JetBrains RustRover 2024.2 (macOS, Linux, Windows) - 面向 Rust 开发者的强大 IDEJetBrains RustRover 2024.2 (macOS, Linux, Windows) - 面向 Rust 开发者的强大 IDE JetBrains 跨平台开发者工具 请访问原文链接:https://sysin.org/blog/jetbrains-rustrover/,查看最新版…

JetBrains RubyMine 2024.2 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE

JetBrains RubyMine 2024.2 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDEJetBrains RubyMine 2024.2 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE JetBrains 跨平台开发者工具 请访问原文链接:https://sysin.org/blog/jetbrains-rubymine/,查看最新版。…

使用分布式锁解决IM聊天数据重复插入的问题

导航业务背景 问题分析与定位 探索可行的解决方案数据库层面处理——唯一索引 应用程序层面处理——分布式锁分布式锁概述分布式锁需要具备哪些特性? 分布式锁有哪些实现方式?基于数据库的实现方式 基于Redisson实现方式Redission介绍概述 可重入锁基于Redisson解决方案方案梳…

IEC104初学者教程,第十章:APDU 序列号

第十章:APDU 序列号平时学习规约或调试IEC104或IEC101设备,需要IEC104/101模拟器,推荐一款: 主站下载地址:IEC104主站模拟器 从站下载地址:IEC104从站模拟器未受干扰的编号 I 格式 APDU 序列V(S) = 发送状态变量(发送序列号) V(R) = 接收状态变量(接收序列号) Ac…

读软件开发安全之道:概念、设计与实施05模式(上)

模式1. 模式 1.1. 模式分类1.1.1. 设计属性1.1.2. 暴露最少信息1.1.3. 冗余1.1.4. 强力执行1.1.5. 信任与责任1.1.6. 反模式1.2. 模式可以缓解或者避免很多种类的风险,它们可以形成一个重要的工具箱,帮我们解决潜在的安全威胁 1.3. 不需要为了解决一个问题就把所有设计模式全…

Dapr v1.14 版本已发布

Dapr是一套开源、可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性、微服务、无状态以及有状态等应用程序类型。Dapr能够确保开发人员专注于编写业务逻辑,而不必分神于解决分布式系统难题,由此显著提高生产力并缩短开发时长。Dapr 是用于构建云原生应用…

k线训练营排名

玩了1天时间,就能排到前30 量学真的好,别的不多说了

tar命令打包指定目录及其文件,而不包括其上级目录

想指定将/var目录下的log目录及其文件打包到当前目录,在压缩包解压时不包括/var目录,可使用如下方式: tar -zcvf log_bak.tar.gz -C /var/ log    # 注意log前面有空格,不是/var/log解压到data目录里查看 tar -zxvf log_bak.tar.gz -C data/可见,将打包的文件解压到da…

【第3期】2024 搜索客 Meetup | Elasticsearch 的代码结构和写入查询流程的解读 - 下篇

本次活动由 搜索客社区、极限科技(INFINI Labs)联合举办,活动主题将深入探讨 Elasticsearch 的两个核心方面:代码结构以及写入和查询的关键流程。本次活动将为 Elasticsearch 初学者和有经验的用户提供宝贵的见解,欢迎大家报名参加、交流学习。 活动主题:Elasticsearch 的…

后台设计产品经理指南:用AxureRP设计功能强大的后台系统仪表盘

在现代化的后台管理系统中,仪表盘(Dashboard)作为核心界面,提供了关键数据的实时可视化展示。它不仅能帮助管理者迅速了解当前业务状况,还能发现潜在问题并及时作出调整。仪表盘的重要性在于其能够整合各类复杂信息,以直观的图表、数字等形式呈现,极大地提升了数据的易读…

网络资产安全防护系统设计与应用(产品经理视角下使用AxureRP的设计方案)

在当今高度数字化的世界中,网络资产的安全防护已成为企业生存与发展的关键要素。网络资产安全防护后台系统作为保障企业信息安全的核心工具,能够实时监控、分析和管理网络中的各类资产,防止潜在的安全威胁。这类系统的重要性在于其可以识别并应对多种安全风险,提供全面的漏…