CF1693F题解
备注
发表时间:2023-06-17 21:51
前言
yny 学长来 cdqz 讲课,写一篇讲课的题的题解纪念一下。
题意
给你一个 01 序列,有以下操作:
- 选择一段区间
设 \(cnt_0,cnt_1\) 分别表示该区间中0和1的数量。
花费 \(|cnt_0-cnt_1|+1\) 的代价对区间进行升序排序。
求最小代价。
思路
肯定是使每次操作的区间中 01 个数差越小越好,所以考虑每次都选择尽可能长且 01 个数差最小的区间。
如果最前面一段都是 0,那就不用管前面。相当于每次都从第一个 1 开始考虑(注意不是操作区间的左端点)。
题解
因为每次操作必须是 \(cnt_0 = cnt_1\) 才最优。
所以现在考虑如何找最优区间。
为了简化思维,我们可以先只考虑整个序列 0 比 1 多时如何求解,因为这样我们可以加 0 进行贪心。
弱化版
首先每次从区间最左端的 1 开始考虑,我们可以贪心去找最优区间。
因为 0 永远比 1 多,所以如果后面的 0 少了可以直接从前面拿 0 来补齐。
所以现在问题就在如何求最优区间。
此时,本题最妙的点来了。我们可以给 0 和 1 赋值为 \(1\) 和 \(- 1\),将这个区间的变化用图表示。

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

其中曲线与直线最右端的交点就是 \(S_r\)。
而图中的曲线就只用记录与直线 \(y = i \left \{i \in [1,n] \mid i \in Z^+\right \}\) 的最右端交点。
最后,如何将方法一般化呢?
我们可以将原来 0 比 1 多的序列变成上面这种特殊序列。
因为原序列中 1 要移到后面、0 要移到前面,所以其实我们只用将原序列翻转,再给 0 1 都取反就行了(读者可自行思考)。
注意
特判序列是否已为升序。
0和1赋值。
代码
/*
* @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;
}
CF1693F题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- 不错的AI项目集合
最近收集了一些不错的AI项目. AutoGPT:AutoGPT 的愿景是让每个人都可以使用和构建无障碍 AI.我们的使命是提供工具,以便您可以专注于重要的事情. Stable Diffusion we ...
- R机器学习:朴素贝叶斯算法的理解与实操
最近又看了很多贝叶斯算法的一些文章,好多的文章对这个算法解释起来会放一大堆公式,对代数不好的人来说真的很头疼.本文尝试着用大白话写写这个算法,再做个例子,帮助大家理解和运用. Naive Bayes ...
- IOS多线程之NSOperation(2)
IOS多线程之NSOperation(2) 最大并发数 open var maxConcurrentOperationCount: Int 并发数就是同时执行的任务数.比如,同时开3个线程执行3个任务 ...
- [BootstrapBlazor] Blazor 使用 Mermaid 渲染详细图表
BootstrapBlazor 是一套基于 Bootstrap 和 Blazor 的企业级组件库,无缝整合了 Bootstrap 框架与 Blazor 技术.它提供了一整套强大的工具,使开发者能够轻松 ...
- MYSQL支持的数据类型-数值类型
一.数值类型分类 MYSQL支持所有标准SQL中的数值类型,其中包括严格数值类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT.REAL和DOU ...
- Qt/C++地图标注点的添加删除移动旋转/指定不同图标和动图/拿到单击信号
一.前言说明 标注点在地图开发中是最常见的应用场景之一,比如在地图上需要显示设备的位置,基本上都是添加标注点,指定图片和尺寸已经经纬度坐标位置.这个功能在每种地图内核中都提供的,这个并没有任何难点,在 ...
- Qt编写物联网管理平台42-数据查询导出打印
一.前言 本系统存储的三大类记录,运行日志.报警日志.用户日志,这些不同类似的记录,都需要提供查询功能,可以按照记录的时间范围等条件查询,查询的记录需要做分页显示,为了分页显示还特意花了很多时间专门封 ...
- Qt音视频开发46-视频传输UDP版
一.前言 上篇文章写道采用的TCP传输视频,优缺点很明显,优点就是不丢包,缺点就是速度慢,后面换成UDP通信,速度快了很多,少了3次握手,而且在局域网中基本上不丢包,就算偶尔丢包,对于一秒钟25-30 ...
- Win10系统安装vue-cli运行环境以及vue在和vue-cli在windows10系统下的默认安装路径(目录)
WIN10系统安装vue-cli运行环境: 1.Win10系统安装VUE及环境配置解析 2.使用vue-cli创建项目 3.vue在和vue-cli在windows10系统下的默认安装路径(目录)为: ...
- milvus操作
java 引入依赖 <dependency> <groupId>io.milvus</groupId> <artifactId>milvus-sdk-j ...