简化问题:如果没有2操作,答案是多少
贪心:修改-一定修改最前面的,修改+一定修改最后面的,正确性显然
而通过1操作,要完成两步:1.让最终结果为q;2.让前缀和非负,通过贪心可以获得最小值
(具体来说,假设初始有nq个+,np个-,第一步操作后前缀最小值为k,那么答案为$(|p+nq-np-q|/2+\max(p-k,0))x$)
那么枚举2操作的次数,考虑此时的答案,即要快速维护之前的贪心过程
前半部分的代价没有改变,相当于要快速维护前缀最小值
这个东西显然可以用优先队列来维护,复杂度$o(n)$
(同时要注意可能第二步的操作可以用第一步来实现(表达不清淅))

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 2000005
4 int n,p,qq,x,y,l,r,s2,a[N],sum[N],q[N];
5 long long ans,s1;
6 char s[N];
7 int main(){
8 scanf("%d%d%d%d%d%s",&n,&p,&qq,&x,&y,s);
9 for(int i=1;i<=n;i++)
10 if (s[i-1]=='+')a[i]=a[i+n]=1;
11 else a[i]=a[i+n]=-1;
12 ans=1LL*n*x;
13 for(int i=1;i<2*n;i++){
14 while ((l<r)&&(q[l]<=i-n))l++;
15 sum[i]=sum[i-1]+a[i];
16 while ((l<r)&&(sum[i]<=sum[q[r-1]]))r--;
17 q[r++]=i;
18 if (i>=n){
19 if (i==n)s1=0;
20 else s1=n*2-i;
21 s1*=y;
22 s2=(1-p-sum[q[l]]+sum[i-n])/2;
23 if (s2<=0)ans=min(ans,s1+abs(p-qq+sum[n])/2LL*x);
24 else ans=min(ans,s1+1LL*s2*x+abs(p-qq+sum[n]+s2*2)/2LL*x);
25 }
26 }
27 printf("%lld",ans);
28 }

[bzoj1122]账本的更多相关文章

  1. [bzoj1122][POI2008]账本BBB

    1122: [POI2008]账本BBB Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 402  Solved: 202[Submit][Status ...

  2. [BZOJ1122][POI2008]账本BBB 单调队列+后缀和

    Description 一个长度为n的记账单,+表示存¥1,-表示取¥1.现在发现记账单有问题.一开始本来已经存了¥p,并且知道最后账户上还有¥q.你要把记账单修改正确,使得 1:账户永远不会出现负数 ...

  3. 【BZOJ1122】[POI2008] 账本BBB

    →传送门← 正解: 贪心加单调队列优化 先粘贴一张别人写的被老师发下来给我们的题解(就是看着这张题解才写出来的) 下面是自己的话(一些具体操作过程): 把环拆成一条2*n的链,然后用优先队列来求出每一 ...

  4. HyperLedger Fabric Introduction——区块链超级账本介绍

    介绍 HyperLedger Fabric是一个基于模块化架构的分布式账本解决方案平台,它拥有深度加密.便捷扩展.部署灵活及可插拔等特性.它设计之初的目的是支持不同组件的可插拔实现,并适应整个经济生态 ...

  5. Hyperledger Fabric Model——超级账本组成模型

    超级账本组成模型 本文主要讲述Hyperledger Fabric的关键设计特性,并细述如何实现了一个全面的.可定制的企业级区块链解决方案: 资产定义--资产这里理解为任何具有货币价值的东西,它们都可 ...

  6. java的制作"时间账本"

    一直以来我都感觉自己的时间过得好荒废啊,貌似只是打开了一个网页链接的时间,一个下午便过去了:仿佛就是看了看空间,刷了刷微信,一天就过去了.哈,当然这是夸张的说法.但是我仔细地算了一下,大概我们每个人每 ...

  7. 一个简单的小小记账本程序(java)

    感觉基础知识学了不少,但是一直搞不清一个项目的实际开发流程,所以就借着这个小记账本的程序梳理一下.因为楼主也是出于学习阶段的菜鸟,所以程序可能会有各种玄学的bug,希望一起提升吧. 跟着站长学到了很多 ...

  8. 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境

    面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...

  9. 用Java为Hyperledger Fabric(超级账本)编写区块链智能合约链代码

    编写第一个 Java 链代码程序 在上一节中,您已经熟悉了如何构建.运行.部署和调用链代码,但尚未编写任何 Java 代码. 在本节中,将会使用 Eclipse IDE.一个用于 Eclipse 的 ...

随机推荐

  1. iOS实现XMPP通讯(一)搭建Openfire

    安装Openfire Openfire官网下载地址:https://igniterealtime.org/downloads/ (也是Spark客户端的下载地址) Openfire下载并安装后,打开系 ...

  2. SpringBoot整合Mabatis

    1.导入 MyBatis 所需要的依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <ar ...

  3. windows环境下基于pycharm安装Redis出现的两个错误解决方案

    说明:下面给出的两个链接是解决安装和使用Redis的时候遇到的两个问题参考的博客网址,本文有解释不清楚的地方可以原博客查看,侵权删! Q1参考链接-https://blog.csdn.net/maqu ...

  4. Poetry(2)Poetry的基本使用方式

    Poetry的基本使用 准备工作 如果你是在一个已有的项目里使用Poetry,你只需要执行 poetry init 命令来创建一个 pyproject.toml 文件: poetry init 可看到 ...

  5. 初学python-day4 字典(已更新完)

  6. Java项目中常用的的五大设计原则

    今天我们一起来聊聊关于设计原则相关的知识点. SOLID五大原则是什么 SRP 单一责任原则 单一责任原则,从名字上我们就能比较好的去理解它.这项原则主张一个对象只专注于单个方面的逻辑,强调了职责的专 ...

  7. kettle使用

    Kettle的安装及简单使用 目录 Kettle的安装及简单使用 一.kettle概述 二.kettle安装部署和使用 Windows下安装 案例1:MySQL to MySQL 案例2:使用作业执行 ...

  8. BUAA-OO-JML

    BUAA-OO-JML JML 概念与 toolchain JML 是一种为 Java 程序设计的.遵循 design by contract 范式的.基于 Hoare Logic 构建的 behav ...

  9. 基于自定义Validator来验证枚举类型

    基于自定义Validator来验证枚举类型 一.背景 二.技术要点 三.实现一个自定义枚举校验. 1.需求. 2.实现步骤 1.自定义一个 Sex 枚举. 2.自定义一个 Enum 注解 3.编写具体 ...

  10. AVL树的插入和删除

    一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度 ...