【数据结构】带修莫队

文章目录

      • 问题引入
    • 核心
      • 维护
        • 修改
    • 总结
      • Code

问题引入

洛谷P1903
嗯,上手一个莫队 … \dots ?还有修改操作?
本文我们来学习带修莫队,及支持修改的莫队。
请确保你已经学会了普通的莫队,不会的可以看这里。

和原来的莫队一样,带修莫队仅仅是多了个修改而已(废话 )。
考虑暴力修改,时间复杂度: O ( n 2 m ) O(n^2m) O(n2m)
显然纯粹的暴力+莫队是解决不了的,但我们又发现了:如果修改的是1,题目查询的是5至7,那么我们修不修改都是可以的。

核心

所以带修莫队的本质还是莫队,只是考虑在查询到区间时再改。
举个例子。
序列
1 2 3 4 5
有四次操作。

  1. 将5改成6
  2. 求下标为1到3中有几个不同的数字
  3. 把1改成2
  4. 求下标为1到3中有几个不同的数字

我们只看查询操作,对于第一次查询,普通莫队可得答案为3。对于第二次查询,修改后由普通莫队可得答案为2。
及用一个变量记录现在修改了几次,在查询时修改,或者改回去。
如现在修改了3次,下次查询是在5次修改后,就执行第4,5次修改。若下下次查询为2次修改后,就撤销第3,4,5次修改。

维护

最重要的当然是排序函数了,然而你会发现跟普通莫队没有什么区别,只是奇偶优化就不用了,改成修改次数从小到大,这也很好理解。
del函数:
和普通莫队没什么区别,不会的见这里。
add函数:
del 函数一样。

修改

对于本题:
首先修改的数得是查询区间内的,否则不可能对答案有影响。
其次,如果对答案有影响,就是一下几种情况:

sum-=(--cnt[a[X]]==0),sum+=(++cnt[Y]==1);

当然,修改用结构体来存储。
需要注意:

  1. 修改时先 + + +在改,撤销是先撤在 − -
  2. 对于修改,再改一次就改回去了,所以我们可以用 swap 偷个懒。
  3. 即使修改的数对答案没影响也要 swap。
  4. 将块的大小设置为 n 2 3 n^\frac{2}{3} n32 时更优。别问我怎么知道 )。

总结

带修莫队就是在莫对队的基础上加了修改操作,需分析题目给的修改操作要如何撤销。

Code

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+1;
struct fy
{int l,r,id,t;
}L[N];
struct fy_
{int x,y;
}C[N];
int n,m,a[N],ans[N],cnt[N],pos[N],ks,gid,aid,x,y,l=1,r=0,t=0,sum=0;
char op;
bool cmp(fy x,fy y)
{return pos[x.l]==pos[y.l]?pos[x.r]==pos[y.r]?x.t<y.t:x.r<y.r:x.l<y.l;
}
inline void add(int x)
{sum+=(++cnt[a[x]]==1);
}
inline void del(int x)
{sum-=(--cnt[a[x]]==0);
}
signed main()
{ios::sync_with_stdio(false);cin.tie(NULL),cout.tie(NULL);cin>>n>>m;ks=pow(n,2.0/3.0);for(int i=1;i<=n;i++)cin>>a[i],pos[i]=(i-1)/ks+1;for(int i=1;i<=m;i++){cin>>op>>x>>y;if(op=='Q')L[++aid].l=x,L[aid].r=y,L[aid].id=aid,L[aid].t=gid;elseC[++gid].x=x,C[gid].y=y;}sort(L+1,L+aid+1,cmp);for(int i=1;i<=aid;i++){int cl=L[i].l,cr=L[i].r,j=L[i].id,T=L[i].t;while(l<cl)del(l++);while(l>cl)add(--l);while(r<cr)add(++r);while(r>cr)del(r--);while(t<T){t++;int X=C[t].x,Y=C[t].y;if(X>=cl&&X<=cr)sum-=(--cnt[a[X]]==0),sum+=(++cnt[Y]==1);swap(a[X],C[t].y);}while(t>T){int X=C[t].x,Y=C[t].y;if(X>=cl&&X<=cr)sum-=(--cnt[a[X]]==0),sum+=(++cnt[Y]==1);swap(a[X],C[t].y);	t--;}ans[j]=sum;}for(int i=1;i<=aid;i++)cout<<ans[i]<<"\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/177374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea创建spring boot项目,java版本只能选择17和21

1.问题描述 java版本为"11.0.20"&#xff0c;idea2023创建spring boot项目时&#xff08;File->Project->Spring Initializr&#xff09;&#xff0c;java版本无法选择11&#xff0c;导致报错&#xff0c;如下图所示&#xff1a; 2.原因 spring2.X版本在2023…

力扣labuladong——一刷day55

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣951. 翻转等价二叉树二、力扣124. 二叉树中的最大路径和三、力扣112. 路径总和&#xff08;遍历&#xff09;四、力扣112. 路径总和&#xff08;分解&a…

GEE errors——在大图像转化为矢量集合中如何避免超限?(含解决方案和详细代码)

问题: 假设在 Google Earth Engine 中有一个大图像,我想将其导出为 CSV。但是,由于它的大小,我很难将其转换为 FeatureCollection 来进行导出,而且我不知道是否有解决方法。 这里将提供几条修改意见,一个是根据经纬度获取个点的值,并用sample进行提取;另外就是重采样…

无效的目标发行版: 21 和springboot爆错

目录 问题描述 原因分析&#xff1a; 问题描述 springboot爆红 调整一下这个&#xff1a;把这里的version调低一点应该就可以了 无效的目标发行版: 21 调整一下这个把这里的Java version调整一下&#xff0c;我是调整到1.8&#xff08;其他没有试过&#xff09; 原因分析&a…

GPT还远远不是真正的智能

GPT是一个基于深度学习的自然语言处理模型&#xff0c;它可以生成逼真的文本。虽然GPT在生成文本方面取得了显著的进展&#xff0c;但它并不具备真正的智能。GPT是通过训练模型来学习语言模式&#xff0c;它不具备理解、推理、判断和主动学习的能力。它只是根据已有的语料库生成…

create-vue 生成式脚手架源码解析

文章目录 命令交互输出渐变标题解析命令行参数命令行交互国际化提示prompts 库实现命令行交互 生成模版创建项目输出文件夹生成 packge.json查找预设的模版文件根据路径生成模块文件render 生成模版填充 ejs 模版数据根据生成项目是 ts 还是 js 后置处理根据需要的模块生成所有…

【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)

​ 目录 一、排序的概念及其运用1.1 排序的概念1.2 排序的应用1.3 常见的排序算法 二、常见排序算法的实现2.1 插入排序2.1.1 直接插入排序2.1.2 希尔排序2.1.3 直接插入排序和希尔排序的性能对比 2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序2.2.3 直接选择排序和堆排序的性能…

c# 责任链模式

责任链模式是一种行为型设计模式&#xff0c;它允许多个对象按照链式结构处理请求&#xff0c;直到有对象能够处理请求为止。在 C# 中&#xff0c;责任链模式通常通过构建一个处理请求的链来实现。 下面是一个简单的示例&#xff1a; 首先&#xff0c;定义一个处理请求的抽象…

Mysql锁实战详细分析

1.mysql回表查询 在这里提起主要是用于说明mysql数据和索引的结构&#xff0c;有助于理解后续加锁过程中的一些问题。 mysql索引结构和表数据结构是相互独立的&#xff0c;根据索引查询&#xff0c;只能找到索引列和主键聚簇索引。如果select语句中不包含索引列&#xff0c;m…

陪诊系统|沈阳陪诊系统定制|陪诊软件保障患者安全与便利

陪诊系统是一种以专业医疗服务为核心的综合性陪同体系。它涵盖了医院前线咨询、专业陪诊、医后关怀等多个环节&#xff0c;提供全方位的医疗咨询服务和专业的医疗陪同服务。通过陪诊系统&#xff0c;患者可以获得更加便捷、高效、安全的医疗服务体验。陪诊系统的出现&#xff0…

多类场景、遍布各地,融云 IM 支撑多款应用全球增长

&#xff08;全网都在找的《社交泛娱乐出海作战地图》&#xff0c;点击获取&#x1f446;&#xff09; 无论是面向企业场景的工作流协同还是消费场景的网络效应形成&#xff0c;商务社交还是陌生人社交&#xff0c;IM 都是必备组件。IM 遍布互联网各角落&#xff0c;出现在所有…

netty学习

netty是一个 NIO 框架&#xff0c;它提供了一个高性能、异步事件驱动的网络应用程序框架 NIO 三大主键channel&buffer 通道/缓冲 &#xff1f;有哪些selector 选择器 &#xff08;适合连接多&#xff0c;流量低&#xff09;多路复用 单线程配合selector管理多个chann…

1.5.1 git/svn日志格式规范

文章目录 git日志规范一 基本原则二 日志格式1 type:2 keys3 subject4 body5 footergit日志规范 一 基本原则 《规则1》小步提交,每个功能模块分别提交 《规则2》源文件与修改文件,分别提交 《规则3》 二 日志格式 type:keys:subject:body:footer 1 type: - `feat`: 新…

【c++|SDL】开始使用之---demo

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 SDL 记录 1. hello word #include<SDL2/SDL.h>SDL_Window* g_pWindow 0; SDL_Renderer* g_pRenderer 0;int main(int argc, char* args[]) {//…

EasyExcel导入及自定义导入

1.maven <!-- Excel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.1</version></dependency> 2.默认使用 List<CrmInvestmentImport> crmInvestmentImportLis…

触控板窗口管理软件Swish mac中文版

Swish mac是一款触控板窗口管理工具&#xff0c;它允许用户通过简单的手势来控制窗口。Swish利用MacBook的触控板&#xff0c;使得用户可以更加便捷地管理窗口。它支持多种手势&#xff0c;例如捏合、拖动、放大和缩小等&#xff0c;使得用户可以轻松地实现窗口的切换、最小化、…

Milvus入门手册1.0

一、window环境搭建&#xff08;单机&#xff09; 1、docker安装 略 2、milvus安装 参考文档&#xff1a;https://milvus.io/docs/install_standalone-docker.md tips: &#xff08;1&#xff09;compose.yaml下载比较慢&#xff0c;可以在网络上找一份。 &#xff08;2&…

VScode集成python开发环境和基本插件下载配置

VSCode开发工具 下载VSCode VSCode官方首页&#xff1a;Visual Studio Code - Code Editing. Redefined 点击Download for Windows下载 安装过程一路下一步即可&#xff0c;其中建议勾选 将"通过Code打开"操作添加到Windows资源管理器目录上下文菜单方便我们直接通过…

虹科Pico汽车示波器 | 汽车免拆检修 | 2016款东风悦达起亚K5车发动机怠速抖动严重、加速无力

一、故障现象 一辆2016款东风悦达起亚K5车&#xff0c;搭载G4FJ发动机&#xff0c;累计行驶里程约为8.2万km。该车发动机怠速抖动严重、加速无力&#xff0c;同时发动机故障灯异常点亮&#xff0c;为此在其他维修厂更换了所有点火线圈和火花塞&#xff0c;故障依旧&#xff0c;…

309.最佳卖股票的时机包含冷冻期

一、题目分析 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 卖出股票后&#xff0c;你无法在第二…