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

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...