首页 > 其他分享 >让我们重新看一看

让我们重新看一看

时间:2024-01-22 22:57:03浏览次数:23  
标签:20 线段 看一看 我们 leq 异或 重新 区间 节点

这篇题解中,我将从线段树的角度重新讲解,同时提出一个扩展。

我们可以用权值线段树维护最长连续段:线段树每个节点维护 \(L,R,M,S\) 分别表示这个区间的左边连续段长度、右边连续段长度、最大连续段长度、区间长度,这样就可以实现区间合并。

这样建的线段树如图:

其中橙色线段代表左儿子,蓝色线段代表右儿子,下同。

为了方便后文叙述,“层”从下往上、从 \(0\) 开始编号,层的最大编号为 \(k\),每一层的节点从 \(0\) 开始编号。

考虑一个异或 \(x\) 的操作,比如 \(x=5\),如果固定底层的节点不变,则线段树会长这个样子:

可以发现,实际上是把第 \(1\) 层和第 \(3\) 层的节点交换左右儿子。

实际上,对于异或 \(x\) 的操作,若 \(x\) 二进制第 \(i\) 位(从低到高,从 \(0\) 开始编号)为 \(1\),则将线段树第 \(i+1\) 层的左右儿子交换。

对于所有的异或 \(x\) 的操作,线段树的节点会有很多重合部分,把所有的操作的线段树建出来并合并,则会是这个样子:

有几个性质:

  • 对于第 \(i(i>0)\) 层第 \(j\) 个节点,它的左儿子是第 \(i-1\) 层第 \(j\) 个节点,右儿子是第 \(i-1\) 层第 \(j\bigoplus 2^i\) 个节点,其中 \(a\bigoplus b\) 表示 \(a\) 和 \(b\) 的按位异或。
  • 对于第 \(k\) 层第 \(j\) 个节点,以这个点为根的线段树是异或 \(j\) 操作后的线段树。

对于本题,第 \(k\) 层节点的 \(M\) 值便是答案。

实际上,由于是线段树,它可以维护区间合并。也就是说,下标异或的背景下,可以 \(O(\log n)\) 求一般的可以区间合并的区间查询,但不支持快速修改(如图,一个底层节点涉及的节点是 \(O(n)\) 的)。

比如有以下问题:

  • 这题的基础上可以加一个值域区间的限制。
  • 给定长度为 \(2^m\) 的序列 \(a\),\(q\) 次询问给定 \(l,r,x\) 求 \(\max_{i=l}^r a_{i\bigoplus x}\),\(1\leq m \leq 20\),\(1\leq q \leq 2^{20}\),\(0\leq a_i\leq 10^9\)。
  • 给定大小为 \(n\) 的集合 \(a\),\(q\) 次询问给定 \(x,k\),求 \(a\) 里的数异或上 \(x\) 后,集合的第 \(k\) 小值,\(1\leq n,q \leq 2^{20}\),\(0\leq a_i\leq 2^{20}\)。
#include <bits/stdc++.h>

using namespace std;

const int M = 21, N = 1 << 19 | 5;

int m = 19, n = 1 << m, q, t, x, y;
struct node{
	int l, r, m, p;
}s[2][N];

void pushup(node &u, node &l, node &r)
{
	u.l = l.p ? l.l + r.l : l.l;
	u.r = r.p ? r.r + l.r : r.r;
	u.m = max(l.r + r.l, max(l.m, r.m));
	u.p = l.p & r.p;
}

int main()
{
	scanf("%d%d", &q, &t);
	while(q -- ) scanf("%d", &x), s[0][x] = {1, 1, 1, 1};
	for(int i = 1, x = 1, y = 0; i <= m; i ++ , x ^= 1, y ^= 1)
		for(int j = 0; j < n; j ++ )
			pushup(s[x][j], s[y][j], s[y][j ^ (1 << i - 1)]);
	while(t -- ) scanf("%d", &x), y ^= x, printf("%d\n", s[1][y].m);
	return 0;
}

标签:20,线段,看一看,我们,leq,异或,重新,区间,节点
From: https://www.cnblogs.com/recollect-the-past/p/17981311

相关文章

  • 【译】为什么我们还没有处于通用人工智能的风口浪尖
    原作:史蒂夫·纽曼引子:你无法通过观察目的地来了解旅程 ChatGPT、Anthropic的Claude或其他AI模型要多久才能实现人类水平的通用智能?在此之前,我认为需要解决几个重大挑战。我将在一系列简短的文章中描述这些挑战,最后对实现时间提出一些想法。在第一篇文章中,我将认为当前......
  • 如何降低股票投资中的决策误判概率(一):我们为什么会产生决策误判
    如果希望在股票投资领域赚钱,需要先知道如何才能亏的一无所有。我从小就对人们为什么会产生决策误判,为什么会做出正确决策这两个问题始终非常感兴趣,工作和接触投资以后,愈发加深,我决定把对这两个问题的感悟写下来以做记录。这篇只记录关于投资领域的决策误判问题。第一,情绪问题......
  • mysql8.0主从不一致,重新同步从库
    背景:线上宕机,导致数据不一致,当时为了快速恢复业务,仅使用主库,现在需要恢复,因为主从数据相差比较大,所以对从库重新进行同步。1、首先重置从库的同步设置、并清除从库不一致数据1)#停止slavestopslave;#重置slave,会重置从库相关设置。resetslaveall;2)#清除已同步......
  • 各种自动化框架的重新理解和学习
    1.关键字驱动测试框架关键字驱动测试框架是一种自动化测试方法,它将测试用例设计和实际执行代码解耦。这种框架基于一种表格形式的描述(如Excel、CSV或特定格式的文本文件),其中每一行代表一个操作步骤,列中包含操作的关键字及其相关参数。在关键字驱动测试框架中,一般有以下......
  • 考试查分场景重保背后,我们如何进行可用性测试
    作者:暮角随着通过互联网音视频与知识建立连接的新学习方式在全国范围内迅速普及,在线教育/认证考试的用户规模呈井喷式增长。但教育容不得半点马虎与妥协,伴随用户规模不断增长,保证系统稳定性、有效避免千万考生考试时遭遇故障风险,成为行业认证机构/部门解决的首要难题。在某次行业认......
  • 考试查分场景重保背后,我们如何进行可用性测试
    作者:暮角随着通过互联网音视频与知识建立连接的新学习方式在全国范围内迅速普及,在线教育/认证考试的用户规模呈井喷式增长。但教育容不得半点马虎与妥协,伴随用户规模不断增长,保证系统稳定性、有效避免千万考生考试时遭遇故障风险,成为行业认证机构/部门解决的首要难题。在某次行......
  • 历史上哪位名人小时候很笨??经过努力学习后成才啊 我们要写片段,拜托 都给想想吧,中国的,外
    历史上哪位名人小时候很笨??经过努力学习后成才啊我们要写片段,拜托都给想想吧,中国的,外国的都行  曾国藩:小时候背书不行,有天家里进了小偷,想等家人睡熟了偷东西。谁知道曾在背书,背了好久都不会。小偷听得不耐烦了,站起来把书背了一遍,说“你这么蠢怎么念书啊?”然后扬长而去。......
  • Vantage客服我们很安全,牌照自己公司授权使用?
    今日是iFXEXPO,迪拜世博展的最后一天~不过今天真相哥要带大伙看的是,昨天参展的券商Vantage~从这次展会的赞助商展牌来看,Vantage在此次展会中的规模应该是中等偏下的,Vantage和STARTRADERPRIME以及UltimaMarkets独占一栏,而Exness可谓是这次展会的老大,,独占“C”位~话题扯远了,让我们......
  • 记一个vue2中使用路由时,在同一个页面跳转,但是url参数不同,不会重新渲染页面的问题
    vue2中使用路由时,页面自己跳转自己,但是携带的参数不一样预期想要的结果是:感冒2会跟随着url的参数进行变化,但是并没用 解决方法: 在App.vue这个页面中的router-view添加  :key="$route.fullPath"结果在自己跳转自己之后会刷新页面 达成:参考:https://blog.csdn.ne......
  • 重新梳理视频接入网关标准类产品线
    目前存在的问题目前网关存在的问题主要有以下几点:1、价格扎堆,并没有拉出一个梯度来。主要是ARM构成的网关和主力出货机型稍微有点重复了,外观一致,功能有点重复,价格区间没拉出来。2、维护的版本非常多既有X86平台的,分Linux和Windows,也有ARM架构下的版本,林林总总的,太复杂......