Luogu P6864 [RC-03] 记忆

news/2024/7/3 6:37:42/文章来源:https://www.cnblogs.com/rizynvu/p/18278861

先考虑没有 \(3\) 操作该怎么做。
对于当前字符串把其分成多组互不包含的括号的形式,即 \((\cdots)()()\) 这样,考虑经过 \(1 / 2\) 操作后对互不包含的括号组数 \(b\) 和答案 \(v\) 会产生什么影响。

  • \(1\) 操作,加上过后便会多上一组互不包含的括号,\(b\leftarrow b' + 1\),同时这个括号能和前面的所有互不包含的括号连起来对答案产生贡献,\(v\leftarrow v' + b' + 1\)
  • \(2\) 操作,此时所有括号都被新的括号包含了,\(b = 1\),答案会多上整个串,\(v\leftarrow v' + 1\)

再来考虑有 \(3\) 操作该怎么做,这个操作即可以改变一个操作对答案是否产生贡献,每次进行此操作都需要重头再推,考虑降低修改的时间复杂度。
单点修改全局查询,考虑到使用线段树,再结合 \(v, b\) 能发现其变化都是 \(\times +\) 操作,考虑把其写成矩阵的形式 \(\begin{bmatrix}v & b & 1\end{bmatrix}\),再来考虑构造每个操作对应的矩阵。

  • \(1\) 操作:\(\begin{bmatrix}v & b & 1\end{bmatrix} \times\begin{bmatrix}1 & 0 & 0 \\ 1 & 1 & 0 \\ 1 & 1 & 1 \end{bmatrix}= \begin{bmatrix}v + b + 1 & b + 1 & 1\end{bmatrix}\)
  • \(2\) 操作:\(\begin{bmatrix}v & b & 1\end{bmatrix} \times\begin{bmatrix}1 & 0 & 0 \\ 0 & 0 & 0 \\ 1 & 1 & 1 \end{bmatrix}= \begin{bmatrix}v + 1 & 1 & 1\end{bmatrix}\)
  • \(3\) 操作:如果是被删除的操作还原按照 \(1 / 2\) 操作构造即可,若是删除则为单位矩阵,即 \(\begin{bmatrix}v & b & 1\end{bmatrix} \times\begin{bmatrix}1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}= \begin{bmatrix}v & b & 1\end{bmatrix}\)

对于每个操作,直接单点修改对应位置的矩阵即可,最后用初始矩阵 \(\begin{bmatrix}1 & 1 & 1\end{bmatrix}\) 乘上全部的操作矩阵的乘积即可。

时间复杂度 \(\mathcal{O}(w^3\times n\log n)\)\(w\) 为矩阵大小。

#include<bits/stdc++.h>
using ll = long long;
const int N = 2e5 + 10;
int n;
struct Matrix {ll a[3][3];Matrix() {memset(a, 0, sizeof(a));}const ll* operator [] (int x) const {return a[x];}ll* operator [] (int x) {return a[x];}Matrix operator * (const Matrix &b) const {Matrix c;for (int i = 0; i < 3; i++) {for (int k = 0; k < 3; k++) {for (int j = 0; j < 3; j++) {c[i][j] += a[i][k] * b[k][j];}}}return c;}Matrix operator *= (const Matrix &b) {return *this = *this * b;}
};
Matrix t[N * 4];
void pushup(int k) {t[k] = t[k << 1] * t[k << 1 | 1];
}
void build(int k = 1, int l = 1, int r = n) {if (l == r) {t[k][0][0] = t[k][1][1] = t[k][2][2] = 1;return ;}int mid = (l + r) >> 1;build(k << 1, l, mid), build(k << 1 | 1, mid + 1, r);pushup(k);
}
void update(int x, const Matrix &y, int k = 1, int l = 1, int r = n) {if (l == r) {t[k] = y;return ;}int mid = (l + r) >> 1;if (x <= mid) {update(x, y, k << 1, l, mid);} else {update(x, y, k << 1 | 1, mid + 1, r);}pushup(k);
}
int opt[N], x[N], vis[N];
void make_matrix(int opt, Matrix &z) {if (opt == 0) {z[0][0] = z[1][1] = z[2][2] = 1;} else if (opt == 1) {z[0][0] = z[1][0] = z[1][1] = z[2][0] = z[2][1] = z[2][2] = 1;} else if (opt == 2) {z[0][0] = z[2][0] = z[2][1] = z[2][2] = 1;}
}
int main() {scanf("%d", &n);build();for (int i = 1; i <= n; i++) {scanf("%d", &opt[i]);if (opt[i] != 3) {Matrix z;make_matrix(opt[i], z);update(i, z);} else if (opt[i] == 2) {Matrix z;z[0][0] = z[2][0] = z[2][1] = z[2][2] = 1;update(i, z);} else {scanf("%d", &x[i]);if (opt[x[i]] == 3) {x[i] = x[x[i]];}vis[x[i]] ^= 1;Matrix z;make_matrix(vis[x[i]] ? 0 : opt[x[i]], z);update(x[i], z);}Matrix x;x[0][0] = x[0][1] = x[0][2] = 1;x *= t[1];printf("%lld\n", x[0][0]);}return 0;
}

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

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

相关文章

模拟集成电路设计系列博客——8.3.2 PLL中的抖动与相位噪声

8.3.2 PLL中的抖动与相位噪声 在PLL中有若干种抖动源,具体来说包括:输入参考的抖动\(\phi_{in}\) VCO中的抖动 环路滤波器产生的噪声 分频器产生的噪声由于任何实际PLL中的抖动都相对较小,因此分析其在环路中和环路内的传播可以使用线性小信号模型。上面列出的噪声源出现在环…

【git】github如何上传超过100MB大小的单个文件

在使用 GitHub 进行版本控制时,默认情况下,单个文件的大小限制为 100MB。 如果你需要上传超过这个大小的文件,可以使用 Git LFS(Large File Storage)。 Git LFS 是一种 Git 扩展,专门用于处理大文件,它将大文件替换为轻量级的指针,并将实际的文件内容存储在远程服务器上…

ros2 - microros - 雷达 -可视化点云

上一节完成了指定角度距离的测量这一节我们将其合成ROS的laserscan消息,并将其通过microros发布到上位机,最终实现rviz2的可视化。 一、雷达消息介绍使用指令ros2 interface show sensor_msgs/msg/LaserScan,可以看到ROS2对雷达数据接口的定义。# Single scan from a planar…

玄机流量特征分析-蚁剑流量分析

玄机流量特征分析-蚁剑流量分析 1.木马的连接密码是多少 2.黑客执行的第一个命令是什么 3.黑客读取了哪个文件的内容,提交文件绝对路径 4.黑客上传了什么文件到服务器,提交文件名 5.黑客上传的文件内容是什么 6.黑客下载了哪个文件,提交文件绝对路径1.过滤http,发现连接密码…

F407在RAM中调试

在RAM中调试代码 一.软硬件操作 硬件方面需要先修改BOOT0和BOOT1的引脚的高低电平。SRAM运行模式BOOT0和BOOT1都是高电平。软件方面: 1.需要先取消勾选Use Memory Layout from Target Dialog,点击下方的Edit编辑.sct2.修改.sct分散加载文件 原始文件 LR_IROM1 0x08000000 0x0…

制作badusb上线CS

‍ 前言在2014年美国黑帽大会上,安全研究人员JakobLell和独立安全研究人员Karsten Nohl展示了他们称为“BadUSB”的攻击方法,这种攻击方法让USB安全和几乎所有和USB相关的设备(包括具有USB端口的电脑)都陷入相当危险的状态现在的USB设备很多,比如语音视频设备、摄像头等,因…

【数据结构】常见的几种数据结构

常见的数据结构:数组、链表、队列、栈、、堆、二叉树、B树、哈希表、图 数组 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。根据索引查找元素,时间复杂度是 \(O(1)\)。 动态数组动态数组具体代码实现 import java.util.Arrays; import java…

QT6.7.2 MSVC源码编译 静态库 动态库

QT6.7.2 MSVC源码编译 静态库 动态库 也可以参考官方的文档 https://doc.qt.io/qt-6/build-sources.html 环境搭建 为了操作更有可复制性,这里在虚拟机中采用全新安装的系统进行配置。 系统镜像为:en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96_2.iso 安装 Visual…

CPU管理 多进程图像

CPU管理 && 多进程图像 要管理CPU,先要学会使用CPU CPU的工作方式在操作系统学习之初就已经提过:取值执行程序存放在内存中,每段指令对应一个地址 CPU发出取指命令,将想取地址通过地址总线传到PC 内存根据地址取出对应地址的指令 从总线传回,CPU解释执行总之,就是…

电子显微镜对生物的观察

某黄色小虫,大概 \(100μm \times 400μm\) 的样子。

ARM Cortex-A 与 STM32 F107

ARM Cortex-A 和 STM32 F107 是两种不同的微控制器架构,它们在性能、应用场景和硬件支持方面有很大的差异。以下是它们的详细比较和分析: 1. 基本特性比较ARM Cortex-A 系列ARM Cortex-A 是 ARM 架构中的高级应用处理器系列,专为复杂的计算任务和高级应用设计。它广泛用于智…

前端开发 | Node 版本管理器选择

一、Nvm nvm 是一款 Node.js 版本管理工具,允许用户通过命令行快速安装、切换和管理不同的 Node.js 版本。nvm 只适用于 macOS 和 Linux 用户的项目,如果是 Windows 用户,可以使用 nvm-windows 、nodist或 nvs 替换。 安装方式 macOS 下载方式: brew install nvm # or sh 命…

示波器基本使用方法

示波器 示波器的基本使用方法首先检查示波器包装中是否有下列物品:• 示波器。 • 电源线。 • N2841A 10:1 10 MΩ 无源探头,数量= 2连接电源和信号源:将示波器的电源插入电源插座,并确保电源适配器或电池充足。 将需要测量的信号源(例如电路板、信号发生器等)连接到示波…

ros - Adafruit ESP32 Feather与树莓派(Raspberry Pi)比较

Adafruit ESP32 Feather 和树莓派(Raspberry Pi)都是广泛使用的硬件平台,分别在嵌入式系统和单板计算机领域具有各自的优势。以下是它们的详细比较,以及它们对机器人操作系统(ROS)的支持程度的分析。 1. 基本特性比较Adafruit ESP32 Feather核心处理器: 双核 Xtensa LX6(…

【App Service】解决 .NET Profiler 报告打开后无数据加载的问题

问题描述 App Service上可以收.NET 应用的Profile Trace文件,并且可以自动分析报告。 Collect a Profiler Trace If your app is down or performing slow, you can collect a profiling trace to identify the root cause of the issue. Profiling is light weight and is de…

1. Docker快速起步

Docker先安装Docker,再讲课没有Docker的日子里在以前的开发时代,开发人员把自己开发好的war交付给运维人员,运维人员为了把war部署到服务器上且保证能运行,就必须由运维人员在服务器上搭建好运行环境! 可这样带来的问题是,如果开发环境与部署环境不一致(比如版本),则会…

6. Idea集成docker

第一步:配置Docker远程访问修改 /lib/systemd/system/docker.service# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sockExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock重启docker服务systemctl daemon…

MOS管的作用和原理

目录 目录什么是MOS管作用和应用工作原理其他类型什么是MOS管 MOS管(Metal-Oxide-Semiconductor Field-Effect Transistor,金属氧化物半导体场效应晶体管)是另一种重要的半导体器件,其作用和工作原理如下: 以下为MOS管的原理图:作用和应用放大作用: MOSFET可以用作信号放…

图论最短路径问题与matlab实现

上一次我们讨论了如何进行图论可视化,这一次我们通过matlab来找出图论中距离最小路径 目录一、迪杰斯特拉算法(Dijkstra)二、shortestpath函数用法1.基本语法2.参数设计3.应用实例(1)输入图论信息(2)输入参数进行求解(3)最短路径可视化三、distances函数————求出任意…