[atAGC045B]01 Unbalanced
将0变为-1后求前缀和,那么$s$的价值即为最大的前缀和-最小的前缀和(特别的,空前缀的前缀和为0)
令$f(x)$表示当最大的前缀和不大于$x$时,最小的前缀和最大是多少,答案即为$\min_{x}x-f(x)$
考虑如何求$f(x)$,可以贪心,先令所有位置都为-1,记最大的前缀和为$k$(要有$k\le x$),然后从前往后贪心将每一个-1变为1并判断是否仍然有$k\le x$,通过维护后缀最大值可以做到$o(n)$
关于贪心正确性的证明:考虑构造,将非最优解第一个与最优解不同的位置改成最优解的位置
(这里的位置指修改的位置,即-1变成1的位置所构成的集合)
较优解相当于对这两个位置之间全部加2,那么$f(x)$必然更大,同时对于这段区间之前的操作较优解和最优解相同(但最优解在这段区间中可能还有修改),最优解合法,较优解一定也合法
(最优解指通过贪心所得到的解,较优解指由非最优解构造得到的解)
进一步的,考虑$x$和$x-2$,若后者仍有位置填的是-1,那么前者一定是通过后者将第一个-1的位置改成1得到(联系贪心的过程,这里可以改成1,且之后与$x-2$相同)
对于$f(x)$和$f(x-2)$,前者即为将后者的一个后缀增加2,即有$f(x)\le f(x-2)+2$,简单的变形可以得到$(x-2)-f(x-2)\le x-f(x)$
设$k$为所有位置都填-1时的最大前缀和,即仅需要计算$f(k)$和$f(k+1)$,复杂度降为$o(n)$

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 int n,sum[N],mx[N];
5 char s[N];
6 int calc(int k){
7 int tag=0,ans=0;
8 for(int i=0;i<n;i++){
9 if ((s[i]=='?')&&(2*(tag+1)+mx[i+1]<=k))tag++;
10 ans=min(ans,2*tag+sum[i+1]);
11 }
12 return ans;
13 }
14 int main(){
15 scanf("%s",s);
16 n=strlen(s);
17 for(int i=0;i<n;i++)
18 if (s[i]=='1')sum[i+1]=sum[i]+1;
19 else sum[i+1]=sum[i]-1;
20 mx[n]=sum[n];
21 for(int i=n;i;i--)mx[i-1]=max(sum[i-1],mx[i]);
22 printf("%d",min(mx[0]-calc(mx[0]),mx[0]+1-calc(mx[0]+1)));
23 }
[atAGC045B]01 Unbalanced的更多相关文章
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- 用Kotlin创建第一个Android项目(KAD 01)
原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...
- Java企业实训 - 01 - Java前奏
前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...
- Node.js 教程 01 - 简介、安装及配置
系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...
- 0042 MySQL学习笔记-入门--01
基本概念: 数据库DB(database): 数据的仓库,数据的集合,是数据的一种结构化的存储 数据库管理系统DBMS(database management system): 管理数据库的一套软件 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- ArtifactTransferException: Failure to transfer org.apache.openejb:javaee-api:jar:5.0-1
最近在myeclipse上创建maven类型的web项目的时候,出现了一个错误. ArtifactTransferException: Failure to transfer org.apache.o ...
- Python学习--01入门
Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...
- 异步编程系列第01章 Async异步编程简介
p { display: block; margin: 3px 0 0 0; } --> 2016.10.11补充 三个月过去了,回头来看,我不得不承认这是一系列失败的翻译.过段时间,我将重新翻 ...
随机推荐
- 题解 [HNOI2012]集合选数
题目传送门 题目大意 直接看题面吧. 思路 感觉挺水的一道题啊?怎么评到紫色的啊?考试的时候LJS出了这个题的加强版我就只想出这个思路,然后就爆了... 不难发现,我们可以构造矩阵: x 2x 4x ...
- Python内置高阶函数map()
map()函数map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于lis ...
- 多项式(polynomial)
多项式(polynomial) 题目大意: 给出一个 n 次多项式 \(f(x)=\sum_{i=0}^na_ix^i\) 对于\(k ≤ x ≤ k + l − 1\) 的\(l\) 个\(x\), ...
- C 标准库函数手册摘要
<stdlib.h> int abs( int value ); long int labs( long int value ); 返回参数的绝对值 int rand( void ); v ...
- Java(36)IO流案例与总结
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228455.html 博客主页:https://www.cnblogs.com/testero ...
- Python技法3:匿名函数、回调函数和高阶函数
1.定义匿名或内联函数 如果我们想提供一个短小的回调函数供sort()这样的函数用,但不想用def这样的语句编写一个单行的函数,我们可以借助lambda表达式来编写"内联"式的函数 ...
- pycharm安装pika提示CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com>
1. 问题描述: pycharm安装第三方库时提示CondaHTTPError: HTTP 000 CONNECTION FAILED. 2. 错误原因:默认镜像源访问速度过慢,会导致超时从而导致更新 ...
- HTTP标签
系统的http状态码知识,我是在<图解http里学习的>. 状态码的职责是告知从服务器端返回的请求结果. 分类如下: 2XX --> 成功 200 OK(一般情况) 204 No C ...
- Java:死锁编码及定位分析
Java:死锁编码及定位分析 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 概念 死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象, ...
- UltraSoft - Beta - Scrum Meeting 12
Date: May 28th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 会议记录修复了课程中心导入作业时出现重复的问题完成了消息中心界面的交互 Liuzh ...