LibreOJ - 2874 历史研究 (回滚莫队)

回滚莫队就是在基础莫队的前提下,用更多的增加操作代替了减操作。

分成两种情况

        1、一个询问的整个区间都在一个块儿里;这种情况直接暴力求即可,因为在一个块儿里,时间复杂度不会高。

        2、一个询问的整个区间不在一个块儿里;这种情况下,在第一个块儿内的区间还是暴力处理,但是从下一个块儿开始的区间就正常的去更新,如下图情况。

          每次都是处理所有左端点都在同一个块儿的询问,按顺序处理1、2、3,在处理某个询问的时候从第一个块儿的右端点 + 1的位置s,从s向右更新到询问的右端点,记录结果值用于之后混滚到暴力处理之前的结果状态。然后从s - 1 向左暴力处理即可,得到询问整个区间的结果,在计算出来这个询问的结果的之后应该把结果回滚到暴力处理左区间之前的结果值,并且把暴力处理区间所更新的状态回滚。在计算第二个询问的时候,s 到右端点的值是从上一个询问s到右端点的结果值更新过来的。每处理完一个询问之后,只保存从第二个块儿开始到右端点的区间结果值。

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define x first
//#define y second
//#define int long long
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, string> pis;
const int mod = 1e9 + 7;
const int N = 1e6+ 10;
int dx[] = {-1, 0, 1, 0, -1, 1, 1, -1};
int dy[] = {0, 1, 0, -1, 1, 1, -1, -1};
int n, m, len;
int o[N];
int w[N], cnt[N], as[N];
ll ans[N];struct Query{ // 记录查询列表int id, l, r;
}q[N];
struct LSH{ // 用于离散,记录值与原来的位置。int a, id;	
}lsh[N];inline int get(int x) // 得到块号
{return x / len;
}bool cmp(const Query& a, const 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(lsh + 1, lsh + n + 1, [&](LSH a, LSH b){ // 先排序return a.a < b.a;});int a = 0, l = -1;for(int i = 1; i <= n; i ++){if(lsh[i].a == l) o[lsh[i].id] = a; // 把离散化后的值替换原来的值else o[lsh[i].id] = ++ a;l = lsh[i].a; // 记录前一个值as[lsh[i].id] = l; // 记录替换前的值,用于计算之后结果}
}inline void add(int a, ll& res) // 增加
{cnt[o[a]] ++;res = max(res, 1ll*cnt[o[a]] * as[a]);
}inline void sovle()
{cin >> n >> m;len = sqrt(n);for(int i = 1; i <= n; i ++) {cin >> lsh[i].a;lsh[i].id = i;}lsh_init(); // 离散化处理for(int i = 0; i < m; i ++) // 输入询问列表{int l, r;cin >> l >> r;q[i] = {i + 1, l, r};}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) // 将所有整个区间都在这个块儿内的询问暴力解决。{ll res = 0;int id = q[x].id, l = q[x].l, r = q[x].r;for(int k = l; k <= r; k ++) add(k, res);ans[id] = res;for(int k = l; k <= r; k ++) cnt[o[k]] --;x ++;}// 求块外的询问ll res = 0;int i = right, j = right + 1; // 当左端点块儿号相同的时候,是按右端点排序的,所以只需要动态的增加即可。最开始是从下一个块的第一个位置开始处理的。while(x < y)  // 将所有左端点在当前块儿,且右端点不在当前块儿的询问解决。{int id = q[x].id, l = q[x].l, r = q[x].r;while(i < r) add(++ i, res); // 处理从下一个块儿开始的区间。ll backup = res; // 记录当前的结果。while(j > l) add(-- j, res); // 暴力向左处理当前块儿的区间。ans[id] = res; // 记录结果while(j < right + 1) cnt[o[j ++]] --; // 回滚状态。res = backup; // 回滚暴力处理之前的结果x ++; // 计算下一个询问。}memset(cnt, 0, sizeof cnt); // 清空标记数组。}for(int i = 1; i <= m; i ++) cout << ans[i] << endl; // 输出结果}
signed main(void)
{IOS;int t = 1;
//	cin >> t;while(t --) sovle();return 0;
}

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

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

相关文章

有效降低数据库存储成本方案与实践 | 京东云技术团队

背景 随着平台的不断壮大&#xff0c;业务的不断发展&#xff0c;后端系统的数据量、存储所使用的硬件成本也逐年递增。从发展的眼光看&#xff0c;业务与系统要想健康的发展&#xff0c;成本增加的问题必须重视起来。目前业界普遍认同开源节流大方向&#xff0c;很多企业部门…

汽车驾驶智能座舱太阳光模拟器老化试验

一、太阳光模拟器老化试验目的 太阳光模拟器氙光灯老化试验是一种常用的材料老化测试方法&#xff0c;通过模拟自然光照条件下的老化过程&#xff0c;评估材料的耐光性能和耐候性能其主要目的有: 1.评估材料在长时间暴露于自然光照条件下的耐久性能: 2.比较不同材料的耐光性…

vue使用websocket与springboot通信

WebSocket是HTML5下一种新的协议&#xff0c;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的 在很多项目中&#xff0c;都要用到websocket&#xff0c;使得前端页面与后端页进行实时通信&#xff0c;例如&#xff0c;实时查询…

vscode设置pycharm中的项目路径和debug方法

真大佬在这 真大佬在这 必须给大佬star 命令行运行&#xff1a; export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时&#xff0c;临时路径会清除&#xff0c;可以将上述export的整条语句&#xff0c;加入~/.bashrc中 该命令中…

使用Ruby编写通用爬虫程序

目录 一、引言 二、环境准备 三、爬虫程序设计 1. 抓取网页内容 2. 解析HTML内容 3. 提取特定信息 4. 数据存储 四、优化和扩展 五、结语 一、引言 网络爬虫是一种自动抓取互联网信息的程序。它们按照一定的规则和算法&#xff0c;遍历网页并提取所需的信息。使用Rub…

自动驾驶算法(八):基于概率图算法的路径规划--以PRM为例以及路径规划算法总结

目录 1 概率路线算法简介 2 代码解析 3 路径规划算法总结 1 概率路线算法简介 它属于采样算法里面的一类。主要步骤分为两步&#xff1a; 1.构建概率路线图 (1)随机采样点 (2)将新采样点和距离小于阈值的 采样点连接产生图 2.在图上寻找路径 (1)Dijkstra算法…

大数据中经常使用的指令:

1、Hadoop&#xff1a; 1、关闭Hadoop集群的安全模式&#xff1a; hdfs dfsadmin -safemode leave#查看集群的模式的状态&#xff1a; hdfs dfsadmin -safemode get 2、启动、关闭Hadoop集群&#xff1a; start-all.sh stop-all.sh 3、停止yarn中进程的命令&#xff1a; yar…

游戏中的-雪花算法

1、什么是雪花算法&#xff1f; 雪花算法&#xff08;Snowflake&#xff09;是一种生成唯一ID的算法。在游戏开发过程中会为玩家生成唯一的id&#xff0c;或者玩家获得一件装备&#xff0c;为这件装备生成唯一的Id&#xff0c;将此角色和装备的Id保存于数据库当中。 全局唯一性…

决策式AI与生成式AI

人工智能中深度学习&#xff0c;是一种受人脑的生物神经网络机制启发&#xff0c;并模仿人脑来解释、处理数据的机器学习技术&#xff0c;它能自动对数据进行特征提取、识别、决策和生成。它可以从不同的维度进行划分&#xff0c;如果按模型的特点来划分可分为决策式AI和生成式…

Unity 实现文字过长显示省略号

为了整体效果&#xff0c;当文字过长时&#xff0c;我们就会把超出范围的文字弄成省略号。 要实现文字过长显示省略号&#xff0c;只需要使用TextMeshPro&#xff0c;并设置Overflow属性为Ellipsis即可。 如下图&#xff1a; 记。

fmx windows 下 制作无边框窗口最小化最大化并鼠标可拖移窗口

1,最顶端 放一个rectangle 置顶 ,此区域后面实现鼠标拖动 移动窗口,可在上面放置最大,最小,关闭按钮 2,窗口边框模式 设置 none 3,rectangel mousemove事件 uses Winapi.Windows,Winapi.Messages,FMX.Platform.Winprocedure TfrmMain.Rectangle1MouseMove(Sender: TObje…

【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】

文章目录 T32MARM 介绍Trace32 .t32 和 .cmm 差异veloce 下启动TRACE321.1.3 TAP 状态机操作命令1.1.3.1 IDCODE&#xff08;Identification Code&#xff09;寄存器 介绍 T32MARM 介绍 T32MARM 是 Lauterbach 的 Trace32 软件包的一部分&#xff0c;专门用于 ARM 基础架构的微…

ElasticSearch 高级查询语法Query DSL实战

ES倒排索引 当数据写入 ES 时&#xff0c;数据将会通过 分词 被切分为不同的 term&#xff0c;ES 将 term 与其对应的文 档列表建立一种映射关系&#xff0c;这种结构就是 倒排索引。如下图所示&#xff1a; 为了进一步提升索引的效率&#xff0c;ES 在 term 的基础上利用 ter…

Redis中的渐进式遍历-Scan命令

之前我们学习过遍历命令keys,而keys *是一次性的把整个redis中所有的key都获取到.在不知道当前redis中有多少key的情况下,这个操作是非常危险的,可能会一下子得到太多的key而阻塞redis服务器.从而使其他redis客户端卡顿. 通过渐进式遍历,就可以做到,既可以获取到所有的key,同时…

linux服务器添置一块新硬盘操作

之前有一台ubuntu服务器&#xff0c;考虑未来存储容量可能不够&#xff0c;添加了一块新的硬盘&#xff0c;这是本次添置硬盘过程。 首次接上硬盘&#xff0c;提示&#xff1a; 没有找到新接入设备&#xff0c;查看接线&#xff0c;主板有个硬盘接线端子坏了&#xff0c;更换一…

【MySQL事务篇】多版本并发控制(MVCC)

多版本并发控制(MVCC) 文章目录 多版本并发控制(MVCC)1. 概述2. 快照读与当前读2.1 快照读2.2 当前读 3. MVCC实现原理之ReadView3.1 ReadView概述3.2 设计思路3.3 ReadView的规则3.4 MVCC整体操作流程 4. 举例说明4.1 READ COMMITTED隔离级别下4.2 REPEATABLE READ隔离级别下 …

C# wpf 实现任意控件(包括窗口)更多拖动功能

系列文章目录 第一章 Grid内控件拖动 第二章 Canvas内控件拖动 第三章 任意控件拖动 第四章 窗口拖动 第五章 附加属性实现任意拖动 第六章 拓展更多拖动功能&#xff08;本章&#xff09; 文章目录 系列文章目录前言一、添加的功能1、任意控件MoveTo2、任意控件DragMove3、边…

【计算机网络笔记】网络层服务与核心功能

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】节点部分

文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- &#xff08;二进制安装部署&#xff09;2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- &#xff08;所有 node 节点&#xff09;2.4 部署 etcd 集…

Windows 下编译 TensorFlow 2.9.1 CC库

参考 Intel 的 tensorflow 编译指导&#xff0c;不过项目还是可以用 TF原本的&#xff0c;不是一定要选择Intel 的TF版本。 安装 MSVC 2019 安装 Intel OneDNN OneMKL 似乎也可以不安装 ( & ) https://www.intel.cn/content/www/cn/zh/developer/articles/tool/one…