当前位置: 首页 > news >正文

P4098 ALO 题解

P4098 ALO

题意

给定一个长度为 \(n\) 的互不相同的整数序列 \(a\),定义一个区间 \([l,r]\) 的权值为 \(a_{l\sim r}\) 中的次大值 \(k\)\(a_{l\sim r}\) 中任意一个数的异或值的最大值,即 \(\max\limits_{l\leqslant i\leqslant r} \{a_i\oplus k \}\)

问所有区间权值的最大值。

数据范围

  • \(1\leqslant n \leqslant 5\times 10^4\)
  • \(0\leqslant a_i \leqslant 10^9\)

思路

假如我选择枚举最大值,那么次大值的位置似乎可以有很多,疑似需要使用单调栈,而且非常复杂,于是考虑枚举次大值。

一个数 \(a_i\) 能成为次大值,当且仅当区间内存在恰好一个数大于 \(a_i\),也就是在 \(i\) 左右分别找到第一个大于其的位置 \(l,r\),以 \(a_i\) 做次大值的区间即从 \([l,i]\)\([i,r]\) 开始往外扩展。

那么它最多扩展至哪呢?不难发现扩展的途中不能出现任何一个位置 \(j\) 满足 \(a_j>a_i\),对于 \([l,i]\),其右端点最多也就是扩展至 \(r-1\),而其左端点呢?不难想到再从 \(l-1\) 开始寻找下一个大于 \(a_i\) 的位置 \(l'\),最终区间也就是 \([l'+1,r-1]\)\([i,r]\) 也是同理。

从某个位置开始向左向右寻找第一个大于某个值的位置,可以使用预处理+倍增快速解决。

接下来就是问 \([l'+1,r-1]\)\([l+1,r'-1]\) 中的值与 \(a_i\) 的异或值的最大值,非常经典,使用可持久化 01 字典树解决即可,可以参考 P4735 最大异或和。

要小心边界问题,即某个数左边或右边可能没有比他大的数,那么这种情况下他无法成为次大值。

复杂度

  • 时间:\(O(n\log V)\)
  • 空间:\(O(n\log V)\)

Code

点击查看代码
#include <iostream>
#define _1 (__int128)1using namespace std;
using ll = long long;
using pii = pair<int, int>;void FileIO (const string s) {freopen((s + ".in").c_str(), "r", stdin);freopen((s + ".out").c_str(), "w", stdout);
}const int N = 5e4 + 10, INF = 1e9 + 10;int n, a[N], pre[16][N], suf[16][N], trie[N << 5][2], sum[N << 5], tid, rt[N], ans;int GetPre (int x, int t) {if (x < 1) return 0;for (int i = 15; i >= 0; i--)if (pre[i][x] <= t)x -= (1 << i);return x;
}int GetSuf (int x, int t) {if (x > n) return n + 1;for (int i = 15; i >= 0; i--)if (suf[i][x] <= t)x += (1 << i);return x;
}void Insert (int x, int y) {rt[x] = ++tid;for (int i = 29, now = rt[x], lst = rt[y]; i >= 0; i--) {int t = (a[x] >> i & 1);trie[now][!t] = trie[lst][!t], trie[now][t] = ++tid, now = tid, lst = trie[lst][t];sum[now] = sum[lst] + 1;}
}int Query (int l, int r, int y) {int ret = 0;for (int i = 29, now = rt[r], lst = rt[l - 1]; i >= 0; i--) {int t = (y >> i & 1);if (sum[trie[now][!t]] != sum[trie[lst][!t]]) now = trie[now][!t], lst = trie[lst][!t], ret += (1 << i);else now = trie[now][t], lst = trie[lst][t];}return ret;
}signed main () {ios::sync_with_stdio(0), cin.tie(0);// FileIO("");cin >> n, pre[0][0] = suf[0][n + 1] = INF, rt[0] = ++tid;for (int i = 1; i <= n; i++) cin >> a[i], pre[0][i] = suf[0][i] = a[i], Insert(i, i - 1);for (int i = 1; i <= 15; i++)for (int j = 0; j <= n + 1; j++)pre[i][j] = max(pre[i - 1][j], pre[i - 1][max(0, j - (1 << (i - 1)))]), suf[i][j] = max(suf[i - 1][j], suf[i - 1][min(n + 1, j + (1 << (i - 1)))]);for (int i = 1; i <= n; i++) {int l = GetPre(i, a[i]), r = GetSuf(i, a[i]);int l_ = GetPre(l - 1, a[i]), r_ = GetSuf(r + 1, a[i]);if (l > 0) ans = max(ans, Query(l_ + 1, r - 1, a[i]));if (r <= n) ans = max(ans, Query(l + 1, r_ - 1, a[i]));}cout << ans;return 0;
}
http://www.jsqmd.com/news/1305950/

相关文章:

  • AI项目管理如何避免“只会问答”?建立可执行工作流的5个步骤
  • 桌面多功能交互终端:硬件调试与多协议配置实践指南
  • 如何构建终极英雄联盟自动化工具:5个核心技术模块深度解析
  • 嵌入式开发必备:FatFS文件系统移植与实战应用详解
  • 终极Wand-Enhancer实战指南:5步掌握WeMod专业版功能解锁与远程控制
  • 倒计时一天!智源/TileRT/腾讯/华为/智元创新多方集结,共探 AI 编译的多层级协同优化
  • 2026年7月北京苹果手机维修服务指南|iPhone全系进水、屏幕、电池、主板原装检修 - 苹果手机品牌电脑维修
  • DLP4500 EVM实战指南:从硬件连接到光学投影的常见问题与解决方案
  • 英雄联盟Akari助手:3分钟快速上手的游戏自动化工具
  • 编程用哪个AI大模型好?实测GPT-5.6和Claude的真实体验
  • Slurm作业调度实战:从sbatch到sacct的完整生命周期管理
  • 2026年2月28日周六时间管理全攻略
  • 2026年 上海小件行李搬运配送团队推荐榜单:同城/跨城速运,专业打包与安心守护优选 - 优企名品
  • 如何用MZmine3免费开源质谱数据分析软件加速你的科研发现
  • 天猫店群自动化管理系统:综合代码架构自愈,异常自动恢复不中断
  • 手机卡托又薄又小还高光,嘉腾闪测仪把多参数检测做到秒级批量完
  • 含金量高财务岗位证书有哪些?2026年财务人考证与职业升级指南
  • PrimeTime静态时序分析:get_cells命令深度解析与应用实战
  • 三维设计云桌面方案
  • 大麦抢票脚本完整指南:告别手动抢票的终极解决方案
  • 巴中水电维修怎么找正规平台?资质报价验收三步筛选(2026) - 家修助手
  • 工业级端侧健康监测算法落地实践:从PPG信号处理到低功耗推理优化
  • 恭城县外墙漏水维修_2026桂北恭城瑶乡城市漏水维修价格行情与靠谱吗 - 雨婺虹房屋维修
  • 模糊控制与神经模糊在车辆导航中的MATLAB实现
  • 2026即墨区家装防水修缮商家盘点:漏水维修避坑指南与本土服务商横向解析 - 国麟测评
  • 平均延迟上升 9% 就回滚?多维度数据可视化揭示 Web 服务缓存更新真相
  • 上海生产管理系统服务商:专业服务助力企业高效运营
  • AI CRM怎么选?从销帮帮CRM看业务融合型AI的评估逻辑
  • 深入解析Cyclone IV FPGA内部架构:从逻辑单元到时钟网络的工程实践指南
  • GPT-5.6 Sol资源优化:Codex限额重置下的工程实践指南