刷题记录: wannafly25 E 牛客NC19469 01串 [线段树维护动态dp]
传送门:牛客
题目描述:
Bieber拥有一个长度为n的01 串,他每次会选出这个串的一个子串作为曲谱唱歌,考虑该子串从左
往右读所组成的二进制数P。 Bieber每一秒歌唱可以让P增加或减少 2 的 k次方(k由Bieber选
定),但必须保证任意时刻其P大于等于0。
Bieber 是一位追求效率的人 每次Bieber都想知道他歌唱的最少时间将这个数P变成0。
Bieber 正和 一位DJ合作,他随时可能修改串上的一个字符。
输入:
4
1101
1
1 1 4
输出:
3
本文参考了:这篇题解与这篇题解与我的一位学长的详细解释.
说实话,那两篇题解写的是真的简略,而且这道题是牛客上的题,这就意味着基本上没有几篇题解,事实上也是如此,全网只有这两篇,在想这道题的过程中,我曾一度想要放弃,但是一想到我当初写牛客题解的初衷不就是写那些题解稀少的题的题解来帮助其他人更好的刷牛客竞赛的题吗??,然后就请教了一位大佬学长.故最后有了这篇题解.
首先这道题的解法是线段树维护动态dp,官方的贪心想法要比动态dp麻烦许多倍,因此此处就只考虑动态dp的做法.
所谓动态dp就是可修改的dp.所以我们得先考虑出dp方程.考虑使用dp[i][j]dp[i][j]dp[i][j]来记录一段区间从后面的区间进位上来jjj,并且向前面的区间进位上去iii的情况下变为0的最小步骤数.可能有很多人看完这个dp方程会有点疑惑,就像我刚开始看到题解中的dp方程完全一头雾水一样,因此我举个栗子:(当我们计算A区间dp[0][0]dp[0][0]dp[0][0]的情况)
只考虑两个连续的区间B、C和他们组成的区间A的关系
比如B为0100 C为1011,那A就是0100 1011
这时候我们如果希望A变为全0,那就是B和C都变为全0
那么此时就是C区间向B区间进位了或者没有进位(在这里,我们贪心的想一下,显然进位最大是1的时候是最优的,不然我们由后面进位2显然超过了B区间直接+1的步骤数所以此处只考虑进位为0/1的情况).
解释一下此处的进位是什么意思.因为一系列操作,我们的C区间想变为0的话,有两种情况,要么没有进位,C区间直接变成了0000,要么C区间变成了10000,然后向前面进了一位,然后此时C变成0000,B区间因为C区间的进位变成了0101,此时的两种情况分别C区间分别对应的dpdpdp方程就是dp[0][0],dp[1][0]dp[0][0],dp[1][0]dp[0][0],dp[1][0].
注意此时的10000情况可以直接通过一个操作变成0000!!
对应我们的C区间的进位情况,显然我们的B区间也会有两种情况:
1.当我们的C区间是dp[0][0]dp[0][0]dp[0][0]的情况时,因为C区间是B区间紧挨着的区间,所以此时B区间必没有向它进位的区间,这就意味着B区间此时只有dp[0][1]dp[0][1]dp[0][1](因为A区间为(0,0),所以B区间不能向前进位).此时我们的A区间变为0所需要的步骤就是B.dp[0][0]+C.dp[0][0]B.dp[0][0]+C.dp[0][0]B.dp[0][0]+C.dp[0][0]
2.当我们的C区间是dp[1][0]dp[1][0]dp[1][0]的情况时,因为C区间是B区间紧挨着的区间,所以此时B区间必获得了一个进位,所以此时我们的B区间只能是dp[0][1]dp[0][1]dp[0][1],此时我们的A区间变为0所需要的步骤数就是B.dp[0][1]+C.dp[1][0]B.dp[0][1]+C.dp[1][0]B.dp[0][1]+C.dp[1][0]
类似的我们A区间还有三种情况,分别是1.A区间向前面区间进位,后面区间没有向A区间进位 2.A区间向前面区间进位,后面区间向A区间进位 3.A区间没有向前面区间进位,后面区间向A区间进位,分析的方法同上,此处就不在赘述了
顺便附带一下对于初始化的解释(以区间为单个1为例):
dp[0][0]=1,直接减去2的0次幂,1步
dp[0][1]=1,减去2的1次幂,因为此时得到一个进位,原本的1变成了10,所以去掉10
dp[1][0]=1,需要向前进位一个1,所以添加一个2的0次幂,1变为10
dp[1][1]=0,不用额外操作,1加上后面进位的1后变为10,可以直接进位
至此,dp分析结束
对于此题来说,我们需要维护的是一个带修改的dp,我们可以将我们的dp方程看成一个二维的矩阵,然后对于我们的区间合并来说,就是两个矩阵的合并,对于这个,我们可以使用线段树进行维护,具体维护方法可以参考具体代码
下面是具体的代码部分:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define root 1,n,1
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {ll x=0,w=1;char ch=getchar();for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x*w;
}
#define maxn 1000000
const double eps=1e-8;
#define int_INF 0x3f3f3f3f
#define ll_INF 0x3f3f3f3f3f3f3f3f
struct Segment_tree{int l,r;int dp[2][2];void init(int x) {if(x==1) {dp[0][0]=dp[1][0]=dp[0][1]=1;dp[1][1]=0;}else {dp[0][0]=0;dp[0][1]=1;dp[1][0]=1;dp[1][1]=1;}}
}tree[maxn*4];
Segment_tree operator + (Segment_tree x,Segment_tree y) {Segment_tree z;z.l=x.l;z.r=y.r;z.dp[0][0]=min(x.dp[0][0]+y.dp[0][0],x.dp[0][1]+y.dp[1][0]);z.dp[0][1]=min(x.dp[0][0]+y.dp[0][1],x.dp[0][1]+y.dp[1][1]);z.dp[1][0]=min(x.dp[1][0]+y.dp[0][0],x.dp[1][1]+y.dp[1][0]);z.dp[1][1]=min(x.dp[1][0]+y.dp[0][1],x.dp[1][1]+y.dp[1][1]);return z;
}
int n,m;int a[maxn];
void pushup(int rt) {tree[rt]=tree[ls]+tree[rs];
}
void build(int l,int r,int rt) {tree[rt].l=l;tree[rt].r=r;if(l==r) {tree[rt].init(a[l]);return ;}int mid=(l+r)>>1;build(lson);build(rson);pushup(rt);
}
void update(int pos,int v,int rt) {if(tree[rt].l==pos&&tree[rt].r==pos) {tree[rt].init(v);return ;}int mid=(tree[rt].l+tree[rt].r)>>1;if(pos<=mid) update(pos,v,ls);else update(pos,v,rs);pushup(rt);
}
Segment_tree query(int l,int r,int rt) {if(tree[rt].l==l&&tree[rt].r==r) {return tree[rt];}int mid=(tree[rt].l+tree[rt].r)>>1;if(r<=mid) return query(l,r,ls);else if(l>mid) return query(l,r,rs);else return query(l,mid,ls)+query(mid+1,r,rs);
}
int main() {n=read();string s;cin>>s;m=read();for(int i=1;i<=s.length();i++) a[i]=s[i-1]-'0';build(root);for(int i=1;i<=m;i++) {int opt=read();if(opt==1) {int l=read(),r=read();printf("%d\n",query(l,r,1).dp[0][0]);}else {int x=read(),y=read();update(x,y,1);}}return 0;
}
相关文章:
刷题记录: wannafly25 E 牛客NC19469 01串 [线段树维护动态dp]
传送门:牛客 题目描述: Bieber拥有一个长度为n的01 串,他每次会选出这个串的一个子串作为曲谱唱歌,考虑该子串从左 往右读所组成的二进制数P。 Bieber每一秒歌唱可以让P增加或减少 2 的 k次方(k由Bieber选 定),但必须…...

懂九转大肠的微软New Bing 内测申请教程
最近微软的New Bing开放内测了,网上已经有拿到内测资格的大佬们对比了ChatGPT和New Bing。对比结果是New Bing比ChatGPT更强大。来看看具体对比例子吧 1.时效性更强 ChatGPT的库比较老,跟不上时事,比如你问它九转大肠的梗,ChatG…...

WRAN翻译
基于小波的图像超分辨残差注意力网络 Wavelet-based residual attention network for image super-resolution 代码: https://github.com/xueshengke/WRANSR-keras 摘要: 图像超分辨率技术是图像处理和计算机视觉领域的一项基础技术。近年来,…...
ROS学习笔记——第二章 ROS通信机制
主要跟着[1]学习ros::Rate r(1); //错误,应改为ros::Rate r(10);[2]对Topic通信打的比方很形象,便于理解记忆。[3]有整个过程的图片,对于初学者更加友好[4]对发布者的代码注释非常好,方便进一步学习此外CMake官方文档可以查询相关…...

MacOS Pytorch 机器学习环境搭建
学习 Pytorch ,首先要搭建好环境,这里将采用 Anoconda Pytorch PyCharm 来一起构建 Pytorch 学习环境。 1. Anoconda 安装与环境创建 Anoconda 官方介绍:提供了在一台机器上执行 Python/R 数据科学和机器学习的最简单方法。 为什么最简单…...

项目——博客系统
文章目录项目优点项目创建创建相应的目录,文件,表,导入前端资源实现common工具类实现拦截器验证用户登录实现统一数据返回格式实现加盐加密类实现encrypt方法实现decrypt方法实现SessionUtil类实现注册页面实现前端代码实现后端代码实现登录页…...

PHP(14)会话技术
PHP(14)会话技术一、概念二、分类三、cookie技术1. cookie的基本使用2. cookie的生命周期3. cookie的作用范围4. cookie的跨子域5. cookie的数组数据四、session1. session原理2. session基本使用3. session配置4. 销毁session一、概念 HTTP协议是一种无…...

对JAVA 中“指针“理解
对于Java中的指针,以下典型案例会让你对指针的理解更加深刻。 首先对于: 系统自动分配对应空间储存数字 1,这个空间被变量名称b所指向即: b ——> 1 变量名称 空间 明…...

功率放大器在MEMS微结构模态测试研究中的应用
实验名称:功率放大器在MEMS微结构模态测试研究中的应用研究方向:元器件测试测试目的:随着MEMS器件在各个领域中广泛应用,对微结构进行模态测试获得其动态特性参数对微结构的设计、仿真、制造、以及质量控制和评价等方面具有十分重…...

【算法基础】字典树(Trie树)
一、Trie树原理介绍 1. 基本概念 Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。【高效存储和查找字符串集合的数据结构】,存储形式如下: 2. 用数组来模拟Trie树的…...

MyBatis 插件 + 注解轻松实现数据脱敏
问题在项目中需要对用户敏感数据进行脱敏处理,例如身份号、手机号等信息进行加密再入库。解决思路就是:一种最简单直接的方式,在所有涉及数据敏感的查询到对插入时进行密码加解密方法二:有方法一到出现对所有重大问题的影响&#…...

MySQL优化篇-MySQL压力测试
备注:测试数据库版本为MySQL 8.0 MySQL压力测试概述 为什么压力测试很重要?因为压力测试是唯一方便有效的、可以学习系统在给定的工作负载下会发生什么的方法。压力测试可以观察系统在不同压力下的行为,评估系统的容量,掌握哪些是重要的变化…...
CF43A Football 题解
CF43A Football 题解题目链接字面描述题面翻译题面描述题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2代码实现题目 链接 https://www.luogu.com.cn/problem/CF43A 字面描述 题面翻译 题面描述 两只足球队比赛,现给你进…...

Nginx常用命令及具体应用(Linux系统)
目录 一、常用命令 1、查看Nginx版本命令,在sbin目录下 2、检查配置文件的正确性 3、启动和停止Nginx 4、查看日志,在logs目录下输入指令: 5、重新加载配置文件 二、Nginx配置文件结构 三、Nginx具体应用 1、部署静态资源 2、反向代…...

从零实现Web服务器(三):日志优化,压力测试,实战接收HTTP请求,实战响应HTTP请求
文章目录一、日志系统的运行流程1.1 异步日志和同步日志的不同点1.2 缓冲区的实现二、基于Webbench的压力测试三、HTTP请求报文解析http报文处理流程epoll相关代码服务器接收http请求四、HTTP请求报文响应一、日志系统的运行流程 步骤: 单例模式(局部静态变量懒汉…...

MFC入门
1.什么是MFC?全称是Microsoft Foundation Class Library,我们称微软基础类库。它封装了windows应用程序的各种API以及相关机制的C类库MFC是一个大的类库MFC是一个应用程序框架MFC类库常用的头文件afx.h-----将各种MFC头文件包含在内afxwin.h-------包含了各种MFC窗…...
1、H5+CSS面试题
1, HTML5中新增了哪些内容?广义上的html5指的是最新一代前端开发技术的总称,包括html5,CSS3,新增的webAPI。Html中新增了header,footer,main,nav等语义化标签,新增了video,audio媒体标签,新增了canvas画布。…...

亚马逊云科技重磅发布《亚马逊云科技汽车行业解决方案》
当今,随着万物智联、云计算等领域的高速发展,创新智能网联汽车和车路协同技术正在成为车企加速发展的关键途径,推动着汽车产品从出行代步工具向着“超级智能移动终端”快速转变。挑战无处不在,如何抢先预判?随着近年来…...

Springboot扩展点之FactoryBean
前言FactoryBean是一个有意思,且非常重要的扩展点,之所以说是有意思,是因为它老是被拿来与另一个名字比较类似的BeanFactory来比较,特别是在面试当中,动不动就问你:你了解Beanfactory和FactoryBean的区别吗…...

新库上线 | CnOpenDataA股上市公司交易所监管措施数据
A股上市公司交易所监管措施数据 一、数据简介 证券市场监管是指证券管理机关运用法律的、经济的以及必要的行政手段,对证券的募集、发行、交易等行为以及证券投资中介机构的行为进行监督与管理。 我国《证券交易所管理办法》第十二条规定,证券交易所应当…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...