首页 > 其他分享 >Luogu P6864 [RC-03] 记忆

Luogu P6864 [RC-03] 记忆

时间:2024-07-01 21:20:47浏览次数:1  
标签:03 begin end Matrix int Luogu bmatrix RC 操作

先考虑没有 \(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;
}

标签:03,begin,end,Matrix,int,Luogu,bmatrix,RC,操作
From: https://www.cnblogs.com/rizynvu/p/18278861

相关文章

  • LibreOJ 3910 「PA 2022」Mędrcy
    考虑找一下走掉的条件:若\(x\)第\(1\)天走掉,那么就说明\(x\)没有知道任何咒语。若\(x\)第\(2\)天走掉,那么就说明应该存在一个\(y\),按照\(x\)已知的信息,\(y\)应该没有掌握咒语,但是\(y\)第一天没走。若\(x\)第\(3\)天走掉,那么就说明应该存在一个\((y,z)\)......
  • Elasticsearch架构基本原理
    Elasticsearch的架构原理可以详细分为以下几个方面进行介绍:一、Elasticsearch基本概念Elasticsearch(简称ES)是一个基于Lucene构建的开源、分布式、RESTful搜索和分析引擎。它支持全文搜索、结构化搜索、半结构化搜索、数据分析、地理位置和对象间关联关系搜索等功能。ES使用Ja......
  • Could not recover RibbonLoadBalancerClient.choose ServiceInstance
    org.springframework.retry.TryException:Couldnotrecover;nestedexceptionisjava.lang.AbstractMethodError:org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(Ljava/lang/String;Lorg/springframework/cloud/client/loadbalancer/Request;......
  • Qt:6.QWidget属性介绍(windowTitle、windowIcon、windowOpacity)以及QRC机制
    一、windowTitle属性-窗口标题:1.1windowTitle属性介绍:在Qt中,windowTitle属性是QWidget类提供的一个属性,用于设置和获取窗口的标题文本。它通常用于设置顶级窗口的标题栏显示内容。1.2设置窗口标题——setWindowTitle():widget->setWindowTitle("这是窗口标题");1......
  • ENGL642 Research Skills Question
    ENGL642 ResearchSkillsAssignmentQuestionSemesterTwo2023-2024There is one assessed assignment for the module ENGL642 Research Skills. The assignment requiresyouto produce a research proposal (see section‘the research proposal’......
  • [OHOS_ERROR]: Please call hb utilities inside ohos source directory
     当执行hbset报如下错误时:原因时重新拉取了源码,且源码路径被改了[OHOS_ERROR]:Pleasecallhbutilitiesinsideohossourcedirectory【解决办法】卸载hb并在源码路径下重新安装python3-mpipuninstallohos-build安装hbpython3-mpipinstall--userohos-bu......
  • 研0 冲刺算法竞赛 day8 P1303 A*B Problem
    思路:用char[]存储输入,后用int[]逐位计算,根据乘法计算规则错位相加,用数组存储,然后考虑进位,最后倒序输出代码:#include<iostream>#include<cstring>usingnamespacestd;chara1[10001],b1[10001];inta[10001],b[10001],c[10001];intmain(){ cin>>a1>>b1; for......
  • Educational Codeforces Round 167 (Rated for Div. 2) A-D
    A.CatchtheCoin题意:在一个二维坐标系上有一个硬币每秒y轴坐标减一,而你每秒可以向旁边八个方向移动,问你有没有一个时刻你会和硬币重叠。思路:注意到在y小于-2时,我们无论如何都追不到硬币,而其他时候我们可以采取向左下或者右下的策略来保持和硬币y轴下落同步移动的时候接近......
  • Elasticsearch:Painless scripting 语言(二)
    这是继上一篇文章“Elasticsearch:Painlessscripting语言(一)”的续篇。使用field API访问文档中的字段警告:FieldAPI仍在开发中,应视为测试版功能。API可能会发生变化,此迭代可能不是最终状态。有关功能状态,请参阅#78920。使用field API访问文档字段:field('my_......
  • salesforce学习笔记(8)- 邮件模板
    1、背景最近有这样一个需求:有两个自定义对象A和B,两对象关系为Master(A)-Detail(B),A的详细页面有B的关联列表。现在,要求从A页面的活动(Activity)Tab下,使用标准的电子邮件功能进行邮件发送,邮件内容要求包含对象A中的字段数据和对象B中的字段数据,邮件发送或者抄送给固定的6个人。......