方方方的数据结构

news/2025/1/12 1:48:07/文章来源:https://www.cnblogs.com/dingxingdi/p/18199502

总算给我看懂到底是什么意思了。。。

首先我们来考虑按照时间+扫描线进行处理,假设操作如下

黑色是加操作,黄色是乘操作,绿色是加操作,对于红色那条线所代表的点,随着时间的流逝,首先在刚刚进入黑色的时候,这一点的值就被加上了一个数,然后刚刚进入黄色的时候,这一点的值就被乘上了一个数,刚刚进入绿色的时候,这一点的值就被加上了一个数,所以总体顺序是加乘加,然而如果我们按照扫描线处理,顺序就会变成黑绿黄,就错了

所以这道题目的顺序是很重要的,这启示我们不能按照扫描线做,只能老老实实按照时间递增去做

假设没有撤销操作,那么这就是普通的线段树了

有了撤销操作肯定要做一些更改,而且还有时间这一维度,由于我们不能按照扫描线做,我们就对时间进行分块处理

接下来仍然先讨论没有撤销操作的做法

我们仍然值来看红色这个点,假设经过第一块之后,他的值为\(x\),那么接下来我们考虑经过第二块之后他会变成什么

遇到了加操作,变成了\(x+b_1\);遇到了加操作,变成了\(x+b_1+b_2\);遇到了乘操作,变成了\((x+b_1+b_2)\times a_1=a_1x+a_1b_1+a_1b_2\);遇到了加操作,变成了\(a_1x+a_1b_1+a_1b_2+b_3\);遇到了乘操作,变成了\((a_1x+a_1b_1+a_1b_2+b_3)\times a_2=a_1a_2x+a_1a_2b_1+a_1a_2b_2+a_2b_3\)

根据以上过程我们不难发现,我们可以考虑每个加操作的贡献,一个加操作的贡献就是这个加的值与其后面所有乘操作的积,而最开始的值\(x\),最后也会乘以这个块里面所有乘操作的积;以上两部分加起来就是\(x\)经过这个块之后会变成的值

于是我们可以对每一个块内都维护一个线段树,线段树的每一个叶子节点维护两个值,\(a\)\(b\),表示叶子节点所代表的位置传入这个块的值为\(x\),那么经过这个块之后,\(x\)就会变成\(ax+b\)。显然\(a,b\)这两个参数只跟这个块里面的修改操作有关,跟\(x\)无关,所以上述维护是没有问题的

然后我们再来考虑撤销操作。有了撤销操作,就是将一个无限长的矩形变成了一个有限长度的矩形,就像这样

也就是代表这个操作的有限区间

我们假设这个矩形上面的边所在的块的编号为\(l\),下面的边所在的块的编号为\(r\),对于\([l+1,r-1]\)的块的线段树来说,是否有这个操作,任意一个线段树的任意一个叶子节点维护的\(a,b\)是不会变化的,所以我们只需要暴力修改\(l\)的线段树就好了,而且在处理\(r\)的线段树的时候,不用管这个操作

查询的时候,前面的块的部分利用线段树快速查询,块内部分暴力查询即可

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

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

相关文章

手机硬件检测:-DeviceTest

手机硬件检测:Z-DeviceTest官方版是款针对手机硬件所打造的检测工具。手机硬件检测:Z-DeviceTest能够检测硬件和OS,硬件上不仅仅是电池、cpu、内存、OS,甚至连usb、扬声器、指南针、摄像头、GPS、听筒等都能检测。并且手机硬件检测:Z-DeviceTest还能够对市面众多的机型进行检…

OutOfMemoryError

以下的这段代码应该是报错的才对,但是我在运行了之后,程序一直卡在那里。最后请教老师了解到,原来jvm如果不指定运行参数,是会进行自动扩容的。 package com.coding.jvm.oom;public class NativeErrorDemo {public static void main(String[] args) {for (; ; ) {new Threa…

【工具使用】【Shell脚本】【gitlab】下拉所有的仓库代码

1 前言 电脑重置了或者新的项目代码,仓库里二三十个,一个一个拉属实有点拉跨,今儿空了整了个脚本,可以拉下所有的仓库代码。 2 前置 需要装一个解析 json的,windows 的话可以直接下载:下载,mac的话可以再官网下载:官网地址。 然后加入到 PATH 下,效果如下:3 脚本 …

app测试工具monkey

Monkey是Android中的一个命令行工具,可以运行在模拟器或者实际设备中向系统发送伪随机的用户事件流(按键输入、触摸屏输入、手势输入等) 实现对正在开发的应用程序进行测试; Monkey测试之一种为了测试软件的稳定性、健壮性的快速有效的方式 一、什么是Monkey 顾名思义,M…

Markdown的学习笔记

Markdown (#+空格输入后回车自动形成大标题) 字体 (##+空格输入回车形成二级标题,以此类推,最多6级) hello world!(两边加两个*好为粗体) hello world!(两边一个*号为斜体) hello world!(三个*号斜体加粗) hello world!(两边两个~号删除线) 引用(大于>+空格形…

关于idea部署本地项目的问题

因为我部署问题的时忘记把问题截图,所以我这边使用网上的截图。 这个错误信息表明,你正在尝试运行一个由更高版本的Java编译的Spring Boot应用程序,而你当前使用的Java运行时(JRE)版本过低,无法识别这个应用程序的类文件版本。 它这边提示应用程序中的类文件版本是61.0,…

GmSSL3.X编译iOS和Android动态库

一、环境准备 我用的Mac电脑编译,Xcode版本15.2,安卓的NDK版本是android-ndk-r21e。 1.1、下载国密源码 下载最新的国密SDK源码到本地。 1.2、安装Xcode 前往Mac系统的AppStore下载安装最新Xcode。 1.3、安卓NDK下载 下载NDK到本地,选择一个比较新的版本下载即可,我选择的是…

实验31-hanlp_textrank

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6

关于cmd运行javac提示javac 不是内部或外部命令,也不是可运行的程序的问题

大家可以看到我这边cmd运行javac命令,它对我进行了错误的提示,提示javac不是可运行命令和程序。这个问题的根本在于环境变量的配置出现了错误。 接下来就要进行jdk的环境配置了。 注意点:这里要定位到自身存放jdk的bin目录才会生效。点击确定即可,然后打开cmd窗口输入java…

[SWPUCTF 2016]Web7 利用ssrf攻击redis

今天做了一道攻击redis的相关题目,以前没接触过。 初始界面有输入框,随便输入看看。是urllib2相关库报错,去搜了搜发现是Python2的Urllib2头部注入(CVE-2016-5699)。那就看看这个cve。说是Python2.x 3.x的urllib/urllib2从数据解析到发包的整个流程中,均未对URL提供安全性过…

通配符查找

问题:Vlookup查找值在查找范围内对应的并非完全匹配,而是仅几个字相同,该如何使用公式。 函数公式永远不会有最完善的解决方法(如下图第5行查找结果),最好的方法是事先列出简全称对照表。 以下公式可以解决绝大部分问题:=VLOOKUP("*"&TEXTJOIN("*&qu…

CTFshow pwn075

栈迁移CTFshow pwn075 题目描述:栈空间不够怎么办? 首先检查保护:32位开启NX保护,部分开启RELRO,放入ida中看有两次输入点,输入只能到返回地址,所以考虑用到栈迁移 exp: from pwn import *p = remote("pwn.challenge.ctf.show",28276) elf = ELF("./pwn7…