P5906 【模板】回滚莫队不删除莫队

news2024/11/22 16:24:01

        这一题,虽说在洛谷标的是模板题,但可能没有“历史研究”那一题更加模板。

        这一题相对于回滚莫队的模板题,可能在回滚的处理上稍微复杂了一点。对于回滚莫队就不多解释了,可以看一下 回滚莫队模板题 这一篇博客,稍微简单的解释了一下。

        当整个询问区间都在一个块儿内的时候,只需要按顺序暴力解决即可,处理完之后把状态清空。

        当整个询问区间不在一个块儿的时候,按照回滚莫队的思路,按顺序向右更新区间状态。暴力处理当前区间。问题就是按顺序向右更新,只需要记录每个颜色第一次出现的位置即可,就能求出来最大间距。但是从中间位置向左暴力处理当前块儿的时候会发现之前的条件不足以找到最大间距,所以在之前的时候需要记录一下每个颜色最右边的位置即可。然后把结果记录,回滚状态。

int n, m, len;
int o[N], st[N], f[N], sr[N];
struct LSH // 用于离散化处理
{
	int a, id;
} ls[N];
struct Query // 询问列表
{
	int l, r, id;
} q[N];

inline int get(int a) // 得到块儿号
{
	return a / len;
}
bool cmp(Query a, Query b) // 排序函数
{
	int i = get(a.l), j = get(b.l);
	if(i != j) return i < j;
	return a.r < b.r;
}
inline void lsh_init() // 离散化处理
{
	stable_sort(ls, ls + n, [&](LSH a, LSH b)
	{
		return a.a < b.a;
	});
	int pr = -1, s = 0;
	for(int i = 0; i < n; i ++)
	{
		if(ls[i].a == pr) o[ls[i].id + 1] = s;
		else o[ls[i].id + 1] = ++ s;
		pr = ls[i].a;
	}
}
inline void add(int a, int& res)
{
	if(!st[o[a]]) st[o[a]] = a;
	sr[o[a]] = a;
	res = max(res, a - st[o[a]]);
}
inline void sovle()
{
	cin >> n;
	len = sqrt(n); 
	for(int i = 0; i < n; i ++)
	{
		int a;
		cin >> a;
		ls[i] = {a, i};
	}
	lsh_init();
	cin >> m;
	for(int i = 0; i < m; i ++)
	{
		int a, b;
		cin >> a >> b;
		q[i] = {a, b, i};
	}
	stable_sort(q, q + m, cmp);
	for(int x = 0; x < m; )
	{
		int y = x;
		while(y < m && get(q[y].l) == get(q[x].l)) y ++;
		int right = get(q[x].l) * len + len - 1;
		// 整个区间都在块儿内
		while(x < y && q[x].r <= right)
		{	
			int id = q[x].id, l = q[x].l, r = q[x].r, res = 0;
			for(int i = l; i <= r; i ++) add(i, res);
			f[id] = res;
			for(int i = l; i <= r; i ++) st[o[i]] = 0, sr[o[i]] = 0; // 回滚状态,需要把用到的st以及sr回滚状态
			x ++;
		}
		// 不在一个块儿的询问
		int i = right + 1, j = right, res = 0;
		stack<int> yi;
		while(x < y)
		{
			int id = q[x].id, l = q[x].l, r = q[x].r;
			while(j < r) add(++ j, res); // 从中间位置向右顺序遍历
			int backup = res; // 记录res 用于暴力处理之后的回滚
			while(i > l) // 从中间向左暴力处理
			{
				i --;
				if(!sr[o[i]]) // 如果这个颜色在区间内没出现过
				{
					yi.push(o[i]); // 记录一下暴力处理过程中用到的sr,之后全部回滚
					sr[o[i]] = i; // 记录这个颜色最右边的位置,就是当前位置
				}
				res = max(res, sr[o[i]] - i);
			}
			while(yi.size()) // 回滚状态
			{
				int a = yi.top();
				sr[a] = 0;
				yi.pop();
			}
			f[id] = res; // 记录答案
			res = backup; // 回滚res状态
			x ++;
			i = right + 1; // 回滚左端点
		}
		memset(st, 0, sizeof st); // 清空
		memset(sr, 0, sizeof sr);
	}
	for(int i = 0; i < m; i ++)
	cout << f[i] << endl;
}

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

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

相关文章

SpringBoot自动装配 Spring相关 常用设计模式 双亲委派 MongoDB Redis 适配器模式与策略模式

SpringBoot自动装配 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 Spring相关 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 常用设计模式 双亲委派 Java虚拟机定义了三个主要的类加载器: 1、启动类加载器 2、扩展类加载器 …

休闲玩具的软文营销策略

休闲玩具行业作为新兴市场&#xff0c;具有广阔的发展前景&#xff0c;生活水平的提高带来消费观念的升级&#xff0c;城市化进程加速导致人们对休闲娱乐的需求持续上涨&#xff0c;玩具作为娱乐性、放松性、互动性的产品受到广大群体喜爱&#xff0c;休闲玩具市场的竞争也愈发…

我是这样发布成绩的

作为一名老师&#xff0c;每当到了期中或者期末考试后&#xff0c;总是有那么些时刻&#xff0c;想要快点把成绩发布出去&#xff0c;让学生知道他们的努力得到了多少回报。但如何发布成绩呢&#xff1f;传统的纸质方式&#xff1f;太慢&#xff01;一个个发短信&#xff1f;太…

广东开放大学:电大搜题助力学子迎考利器

近年来&#xff0c;广东开放大学一直致力于为广大学子提供优质的教育资源和学习服务。作为一所专注于远程教育的学府&#xff0c;广东开放大学不仅拥有雄厚的师资力量和丰富的教育经验&#xff0c;还致力于创新教学手段&#xff0c;为学生提供更便捷、高效的学习体验。在这个信…

【1++的Linux】之线程(三)含生产者消费者模型

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;可重入与线程安全二&#xff0c;死锁三&#xff0c;线程同步什么是线程同步&#xff1f;怎么实现线程同步条件变量 四&#xff0c;生产者与消费者模型1&…

软件测试用例与分类

测试用例与分类 黑盒测试基于需求的设计方法等价类边界值判定表正交表场景设计法错误猜测法 FiddlerPostman测试用例测试分类按测试对象界面测试可靠性测试容错性测试文档测试兼容性测试易用性安装卸载测试安全测试性能测试内存泄漏测试 白盒测试灰盒测试开发阶段单元测试集成测…

uniapp小程序接入腾讯云【增强版人脸核身接入】

文档地址&#xff1a;https://cloud.tencent.com/document/product/1007/56812 企业申请注册这边就不介绍了&#xff0c;根据官方文档去申请注册。 申请成功后&#xff0c;下载【微信小程序sdk】 一、解压sdk&#xff0c;创建wxcomponents文件夹 sdk解压后发现是原生小程序代…

django+drf+vue 简单系统搭建 (2) - drf 应用

按照本系统设置目的&#xff0c;是为了建立一些工具用来处理简单的文件。 1. 准备djangorestframework 关于drf的说明请参见&#xff1a;Django REST Framework教程 | 大江狗的博客 本系列直接使用drf的序列化等其他功能。 安装 conda install djangorestframework conda i…

第三届 “鹏城杯”(初赛)

第三届 “鹏城杯”&#xff08;初赛&#xff09; WEB Web-web1 反序列化tostring打Hack类 Payload:O%3A1%3A%22H%22%3A1%3A%7Bs%3A8%3A%22username%22%3BO%3A6%3A%22Hacker%22%3A2%3A%7Bs%3A11%3A%22%00Hacker%00exp%22%3BN%3Bs%3A11%3A%22%00Hacker%00cmd%22%3BN%3B%7D%7D…

【Java基础】Java容器相关知识小结

Java容器相关知识 0. 前言1. Collection接口1.1. List接口1.1.1. ArrayList1.1.2. LinkedList1.1.3. Vector1.1.4. Stack 1.2. Set接口1.2.1. HashSet1.2.2. LinkedHashSet1.2.3. TreeSet 1.3. Queue接口1.3.1. PriorityQueue1.3.2. LinkedList 2. Map接口2.1. HashMap2.2. Tre…

Verilog刷题[hdlbits] :Always casez

题目&#xff1a;Always casez Build a priority encoder for 8-bit inputs. Given an 8-bit vector, the output should report the first (least significant) bit in the vector that is 1. Report zero if the input vector has no bits that are high. For example, the …

大数据Doris(十九):数据导入(Load)

文章目录 数据导入(Load) 一、Broker load 二、Stream load 三、Insert 四、Multi load

RabbitMQ集群

RabbitMQ概述 1.RabbiMQ简介 RabbiMQ是⽤Erang开发的&#xff0c;集群⾮常⽅便&#xff0c;因为Erlang天⽣就是⼀⻔分布式语⾔&#xff0c;但其本身并不⽀持负载均衡。支持高并发&#xff0c;支持可扩展。支持AJAX&#xff0c;持久化&#xff0c;用于在分布式系统中存储转发消…

用Python实现朴素贝叶斯垃圾邮箱分类

一、实验目的 通过本实验&#xff0c;旨在使用朴素贝叶斯算法实现垃圾邮箱分类&#xff0c;并能够理解并掌握以下内容&#xff1a; 了解朴素贝叶斯算法的基本原理和应用场景。 学习如何对文本数据进行预处理&#xff0c;包括去除标点符号、转换为小写字母、分词等操作。 理解特…

Selenium alert 弹窗处理!

页面弹窗有 3 种类型&#xff1a; alert&#xff08;警告信息&#xff09;confirm&#xff08;确认信息&#xff09;prompt&#xff08;提示输入&#xff09; 对于页面出现的 alert 弹窗&#xff0c;Selenium 提供如下方法&#xff1a; 序号方法/属性描述1accept()接受2dismis…

图形验证码登录

图形验证码登录 添加图片标签&#xff0c;进入页面访问/api/verifyCode 1.html <img onclick"javascript:getvCode()" id"verifyimg" style"margin-left: 20px;"/><script>getvCode();/*** 获取验证码* 将验证码写到index.html页…

Collection集合 迭代器遍历Iterator 和集合增强For

迭代器遍历Iterator 标准写法: 增强For for(类型 名称 : 集合 ) 举例: 不仅可以集合也可以数组 底层仍然是iterator

python自动化测试(十一):写入、读取、修改Excel表格的数据

目录 一、写入 1.1 安装 xlwt 1.2 增加sheet页 1.2.1 新建sheet页 1.2.2 sheet页写入数据 1.2.3 excel保存 1.2.4 完整代码 1.2.5 同一坐标&#xff0c;重复写入 二、读取 2.1 安装读取模块 2.2 读取sheet页 2.2.1 序号读取shee页 2.2.2 通过sheet页的名称读取she…

OpenHarmony 社区运营报告(2023 年 10 月)

● 截至 2023 年 10 月&#xff0c;OpenHarmony 社区共有 51 家共建单位&#xff0c;累计超过 6200 名贡献者产生 24.2 万多个 PR&#xff0c;2.3 万多个 Star&#xff0c;6.1 万多个 Fork&#xff0c;59 个 SIG。 ● OpenHarmony 4.0 版本如期而至&#xff0c;开发套件同步升级…

【React】04.MVC模式和MVVM模式

React是Web前端框架 1、目前市面上比较主流的前端框架 ReactAngular&#xff08;NG框架&#xff09;Vue 主流的思想&#xff1a; 不在直接去操作DOM&#xff0c;而是改为“数据驱动思想” 操作DOM思想&#xff1a; 操作DOM比较消耗性能[主要原因就是&#xff0c;可能会导…