将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的更多相关文章

  1. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  2. 用Kotlin创建第一个Android项目(KAD 01)

    原文标题:Create your first Android project using Kotlin (KAD 01) 作者:Antonio Leiva 时间:Nov 21, 2016 原文链接:h ...

  3. Java企业实训 - 01 - Java前奏

    前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...

  4. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  5. 0042 MySQL学习笔记-入门--01

    基本概念: 数据库DB(database): 数据的仓库,数据的集合,是数据的一种结构化的存储 数据库管理系统DBMS(database management system): 管理数据库的一套软件 ...

  6. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  7. ArtifactTransferException: Failure to transfer org.apache.openejb:javaee-api:jar:5.0-1

    最近在myeclipse上创建maven类型的web项目的时候,出现了一个错误. ArtifactTransferException: Failure to transfer org.apache.o ...

  8. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  9. 异步编程系列第01章 Async异步编程简介

    p { display: block; margin: 3px 0 0 0; } --> 2016.10.11补充 三个月过去了,回头来看,我不得不承认这是一系列失败的翻译.过段时间,我将重新翻 ...

随机推荐

  1. JVM学习笔记——栈区

    栈区 Stack Area 栈是运行时的单位,堆是存储单位,栈解决程序的运行问题,即程序如何执行,如何处理数据. 每个线程在创建时都创建一个该线程私有的虚拟机栈,每个栈里有许多栈帧,一个栈帧对应一个 ...

  2. 8.JVM内存分配机制超详细解析

    一.对象的加载过程 之前研究过类的加载过程.具体详情可查看文章:https://www.cnblogs.com/ITPower/p/15356099.html 那么,当一个对象被new的时候,是如何加 ...

  3. 关于web项目中的资源跳转

    1.跳转包括两种方式: 转发 forward 重定向 redirect 2.两种方式的代码: AServlet类: //向request范围中存储数据 request.setAttribute(&qu ...

  4. python 类中的公有属性 私有属性 实例属性

    class parent(): i=1 __j=2 class child(parent): m=3 __n=4 def __init__(self,age,name): self.age=age s ...

  5. 华为在HDC2021发布全新HMS Core 6 宣布跨OS能力开放

    [2021年10月22日·东莞]华为开发者大会 2021(Together)于今天正式开幕,华为在主题演讲中正式发布全新的HMS Core 6,向全球开发者开放7大领域的69个Kit和21,738个A ...

  6. 在 Windows 10 上安装 Coq 库 Mathematical Components

    初学 Coq 时看的是 Mathematical Components 这本书,它自带了一个 Coq 的库,这是它的安装教程 这个库的安装要用到 OCaml Package Manager (OPAM ...

  7. 【二食堂】Alpha - Scrum Meeting 2

    Scrum Meeting 2 例会时间:4.11 20:00 - 20:30 进度情况 组员 今日进度 明日任务4.12不开会 李健 1. 学习并成功搭建简单的网页issue2. 学习JS基础知识i ...

  8. Spring Cloud Alibaba整合Sentinel

    Spring Cloud Alibaba 整合 Sentinel 一.需求 二.实现步骤 1.下载 sentinel dashboard 2.服务提供者和消费者引入sentinel依赖 3.配置控制台 ...

  9. freemarker自定义指令

    最近项目中使用了spring boot搭建项目,使用spring security管理项目中的权限,使用freemarker作为视图层.为了将权限控制到按钮上,因此考虑直接使用spring secur ...

  10. (继承)Program2.1

    覆盖和重写的意思是一样?结果是一样的 例如: 1 class Parent: # 定义父类 2 def myMethod(self): 3 print('调用父类方法') 4 5 6 class Ch ...