news 2026/4/27 1:03:07

刷题日记day10(单调栈+异或运算)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
刷题日记day10(单调栈+异或运算)

简介

本篇介绍一道单调栈的模板题,为洛谷黄题目,希望读者阅读完本篇之后可以阅读一下刷题日记day10(单调队列)配合食用效果更佳

前置知识

  • 异或运算的性质


本题的运算中只运用到了这三种性质,剩余的性质我们放在该篇的末尾

题目描述

  • B3666 求数列所有后缀最大值的位置

B3666 求数列所有后缀最大值的位置

题目描述

给定一个数列a aa,初始为空。有n nn次操作,每次在a aa的末尾添加一个正整数x xx

每次操作结束后,请你找到当前a aa所有的后缀最大值的下标(下标从 1 开始)。一个下标i ii是当前a aa的后缀最大值下标当且仅当:对于所有的i < j ≤ ∣ a ∣ i < j \leq |a|i<ja,都有a i > a j a_i > a_jai>aj,其中∣ a ∣ |a|a表示当前a aa的元素个数。

为了避免输出过大,请你每次操作结束后都输出一个整数,表示当前数列所有后缀最大值的下标的按位异或和。

输入格式

第一行是一个整数,表示操作次数n nn
第二行有n nn个整数,依次表示n nn次操作所添加的整数x i x_ixi

输出格式

每次操作后请输出一行一个整数,表示当前数列所有后缀最大值下标的按位异或和。

输入输出样例 #1

输入 #1

5 2 1 3 5 4

输出 #1

1 3 3 4 1

说明/提示

数据规模与约定

对于全部的测试点,保证1 ≤ n ≤ 1 0 6 1 \leq n \leq 10^61n1061 ≤ x i < 2 64 1 \leq x_i \lt 2^{64}1xi<264。请注意大规模数据输入输出对程序效率产生的影响。

思路分析

由题意可知,我们要维护这样一个单调递减的序列,并存储它的下标进行异或运算,需要注意的是,我们每一个输出的ans,都是在考虑完第i个元素后,当前栈中下标的异或总和,有些数字可能后续会被弹出栈中,为了简化运算,避免每次都要将栈中的元素计算一遍(这样就会超时),所以我们采用如下计算方法。

  • 异或和的计算
    我们在弹出元素前进行一次异或操作,在加入元素后进行一次异或操作。为了保持单调栈的结构,我们后续会将一些之前压入栈的元素弹出,此时为了保证,我们要输出的答案是考虑第i个元素后,完整的单调栈元素的异或和,我们就要进行ans^=stk.top();这个操作,请大家仔细想想,这个元素是不是第二次乘到ans当中(这个非常重要),联系到我们前面的性质,这个stk.top()的下标是不是就从异或总和中剔除了,讲到这里大家应该就明白了,通过这个操作,我们每次只需要o(1)就能算出答案。

代码展示

#include<iostream>#include<algorithm>#include<stack>usingnamespacestd;typedefunsignedlonglongll;constintN=1e6+10;intn,ans;stack<int>stk;ll a[N];intmain(){scanf("%d",&n);for(inti=1;i<=n;i++)scanf("%llu",&a[i]);for(inti=1;i<=n;i++){while(!stk.empty()&&a[stk.top()]<=a[i]){ans^=stk.top();stk.pop();}stk.push(i);ans^=i;printf("%d\n",ans);}return0;}

细节问题

注意严格单调递减

与B3667的联系(在简介提到的那篇题解当中)

在P3667中我们是需要保证区间的长度恒定为k,所以在后续我们不断加入元素的过程中,假设我们此时已经把第i个元素加入容器当中,且容器的首元素值小于i-k+1(即小于左边界),(B3666为栈,B3667为队列),我们需要把超出容器长度的部分删掉,但是我们的栈是没有弹出容器头部元素操作的,所以我们采用双端队列deque。我感觉这样的解释其实更符合B3667题目的思路

AI注释后的代码

#include<iostream>#include<algorithm>#include<stack>usingnamespacestd;typedefunsignedlonglongll;// 重定义无符号长整型,存储输入的大数x,避免溢出constintN=1e6+10;// 数组最大长度,适配1e6次操作intn,ans;// n:操作次数;ans:当前后缀最大值下标的异或和(初始默认为0,异或的单位元)stack<int>stk;// 单调栈,存储后缀最大值下标(栈内下标对应a值严格递减)ll a[N];// 存储每次添加的正整数xintmain(){// 输入操作次数nscanf("%d",&n);// 输入n次操作的x值,存入数组a(下标从1开始)for(inti=1;i<=n;i++)scanf("%llu",&a[i]);// 遍历每次操作,维护单调栈并计算异或和for(inti=1;i<=n;i++){// 维护单调栈:移除不再是后缀最大值的下标// 若栈顶下标对应的值 ≤ 当前值a[i],则栈顶下标失去后缀最大值资格while(!stk.empty()&&a[stk.top()]<=a[i]){ans^=stk.top();// 异或自反性(x^x=0):将栈顶下标从异或和中移除stk.pop();// 弹出栈顶无效下标}stk.push(i);// 新下标i加入栈(i一定是后缀最大值下标)ans^=i;// 将i加入异或和(0^i=i,非0则累加)printf("%d\n",ans);// 输出当前所有后缀最大值下标的异或和}return0;}

异或运算的性质






后续的多个性质其实都和第一个性质有着密切联系

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 22:34:21

如何在Unity中高效处理JSON数据:Newtonsoft.Json-for-Unity 终极指南

如何在Unity中高效处理JSON数据&#xff1a;Newtonsoft.Json-for-Unity 终极指南 【免费下载链接】Newtonsoft.Json-for-Unity 项目地址: https://gitcode.com/gh_mirrors/newt/Newtonsoft.Json-for-Unity 3分钟快速配置与IL2CPP兼容性问题解决 对于Unity开发新手来说…

作者头像 李华
网站建设 2026/4/26 22:30:42

Root设备安全检测突破:safetynet-fix深度技术解析

你是否曾经因为Root设备而无法使用银行应用、玩不了热门游戏&#xff0c;甚至被流媒体服务拒之门外&#xff1f;当Google Play Protect的严格检测机制将你的设备标记为"不安全"时&#xff0c;那种挫败感确实令人沮丧。今天&#xff0c;我们将深入探讨safetynet-fix这…

作者头像 李华
网站建设 2026/4/26 21:26:27

电影剧本数据库:构建AI训练与影视分析的终极语料库

电影剧本数据库&#xff1a;构建AI训练与影视分析的终极语料库 【免费下载链接】Movie-Script-Database A database of movie scripts from several sources 项目地址: https://gitcode.com/gh_mirrors/mo/Movie-Script-Database 电影剧本数据集在现代影视研究和人工智能…

作者头像 李华
网站建设 2026/4/24 5:17:23

Awesome Jellyfin:打造个性化家庭媒体中心的完整解决方案

Awesome Jellyfin&#xff1a;打造个性化家庭媒体中心的完整解决方案 【免费下载链接】awesome-jellyfin A collection of awesome Jellyfin Plugins, Themes. Guides and Companion Software (Not affiliated with Jellyfin) 项目地址: https://gitcode.com/gh_mirrors/aw/a…

作者头像 李华
网站建设 2026/4/17 19:12:54

为IoT-DC3创建全新结构技术文章的仿写prompt

为IoT-DC3创建全新结构技术文章的仿写prompt 【免费下载链接】iot-dc3 IoT DC3 is an open source, distributed Internet of Things (IoT) platform based on Spring Cloud. It is used for rapid development of IoT projects and management of IoT devices. It is a set o…

作者头像 李华
网站建设 2026/4/27 10:55:40

如何快速掌握Archi:免费开源的ArchiMate企业架构建模工具终极指南

如何快速掌握Archi&#xff1a;免费开源的ArchiMate企业架构建模工具终极指南 【免费下载链接】archi Archi: ArchiMate Modelling Tool 项目地址: https://gitcode.com/gh_mirrors/arc/archi Archi是一款完全免费、开源且跨平台的专业企业架构建模工具&#xff0c;专门…

作者头像 李华