Codeforces Round 956 F. array-value 【01Trie查询异或最小值】

F

题意

给定一个非负整数数组 a a a
对每个长度至少为 2 2 2 的子数组,定义其权值为:子数组内两两异或值最小
b ⊂ a [ l , r ] , w ( b ) = min ⁡ l ≤ i < j ≤ r { a i ⨁ a j } b \subset a[l, r], \quad w(b) = \min_{l \leq i < j \leq r} \{a_i \bigoplus a_j\} ba[l,r],w(b)=minli<jr{aiaj}

求出所有子数组中权值第 k k k 小的权值

思路

我们可以先二分答案 m i d mid mid,并且快速统计有多少个子数组的权值 ≤ m i d \leq mid mid,记为 c n t cnt cnt,如果 c n t ≥ k cnt \geq k cntk,说明答案可能比 m i d mid mid 更小,否则说明答案一定比 m i d mid mid 更大

问题在于如何快速统计 c n t cnt cnt? 注意到其实随着子数组越大(越长),那么其权值一定是非递增的,也就是说更大的子数组会有更大的可能性满足权值 w ≤ m i d w \leq mid wmid

基于上述的观察,我们考虑先枚举区间的右端点 r p rp rp,我们要选择最大 l p lp lp,使得 a [ l p , r p ] a[lp, rp] a[lp,rp] 里, 任意一个右端点在 r p rp rp 的子数组,其权值都大于 m i d mid mid,也即是 a [ l p , r p ] a[lp, rp] a[lp,rp] 里任意两两的异或权值都大于 m i d mid mid,等价于两两异或的最小值大于 m i d mid mid

又由于我们是从小到大枚举 r p rp rp 的,那么上一轮的 r p − 1 rp - 1 rp1 就对应着其极大的 l p lp lp,如果 l p lp lp 再小(即子数组更长),那么就会破坏上面的约束,使得最小值小于等于 m i d mid mid

因此新加入 a r p a_{rp} arp 时,我们只需要在 01 T r i e 01 \; Trie 01Trie 上对 a r p a_{rp} arp 查询异或最小值(因为前面 [ l p , r p − 1 ] [lp, rp - 1] [lp,rp1] 两两异或值都符合要求),不难发现,我们的 l p lp lp非递减的,这是一个双指针的过程。

对于一对极大的 [ l p , r p ] [lp, rp] [lp,rp],右端点在 r p rp rp 的权值小于等于 m i d mid mid 的子数组数量为 l p − 1 lp - 1 lp1,即左端点的选择范围是: [ 1 , l p − 1 ] [1, lp - 1] [1,lp1]

l p lp lp 右移时(删除某些 a l p a_{lp} alp),我们只需要在 01 T r i e 01 \; Trie 01Trie擦除这些值即可

这样子就在 O ( n log ⁡ A ) O(n \log A) O(nlogA) 下快速统计出了权值小于等于 m i d mid mid 的子数组数量

总体时间复杂度: O ( n log ⁡ 2 A ) O(n \log ^ 2 A) O(nlog2A)

注意每次二分都要清空 T r i e Trie Trie

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;const int INF=0x3f3f3f3f;
const long long INFLL=1e18;typedef long long ll;const int N = 100005;struct node{int son[2];int cnt;int idx;
}tree[N * 32];int tot;void clear(){fore(i, 0, tot + 1){tree[i].cnt = tree[i].idx = tree[i].son[0] = tree[i].son[1] = 0;}tot = 0;
}void insert(int x, int i){int now = 0;for(int i = 29; i >= 0; --i){int ch = (x >> i & 1);if(!tree[now].son[ch])tree[now].son[ch] = ++tot;now = tree[now].son[ch];++tree[now].cnt;}tree[now].idx = i;
}std::pair<int, int> query(int x){ //return [mn, idx]int res = 0;int now = 0;for(int i = 29; i >= 0; --i){int ch = (x >> i & 1);int to = tree[now].son[ch];if(to && tree[to].cnt){now = to;}else{res |= (1 << i);now = tree[now].son[ch ^ 1];}}return {res, tree[now].idx}; //返回异或最小值和产生的下标i
}void erase(int x){int now = 0;for(int i = 29; i >= 0; --i){int ch = (x >> i & 1);now = tree[now].son[ch];--tree[now].cnt;}
}int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int t;std::cin >> t;while(t--){int n;ll k;std::cin >> n >> k;std::vector<int> a(n + 1);fore(i, 1, n + 1) std::cin >> a[i];ll ans = 0;ll l = 0, r = 2e9;while(l <= r){clear();ll mid = l + r >> 1;int lp = 1, rp = 2;ll cnt = 1ll * n * (n - 1) / 2;;insert(a[1], 1);while(rp <= n){while(true){if(lp == rp) break;auto [mn, i] = query(a[rp]);if(mn > mid) break;while(lp <= i){erase(a[lp]);++lp;}}if(lp < rp){cnt -= rp - lp; //减去权值大于mid的子数组数量}insert(a[rp], rp);++rp;}if(cnt >= k){ans = mid;r = mid - 1;}else l = mid + 1;}std::cout << ans << endl;clear();}return 0;
}

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

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

相关文章

WPF的UI布局

WPF 的 UI 布局 XAML的优点 ui和动画更专业-好用 简单易懂&#xff0c;结构清晰-易学 使设计师直接参与软件开发&#xff0c;随时沟通无需二次转化-高效 真正实现了UI和逻辑的剥离(ui集中在ui层、逻辑代码集中在程序逻辑层&#xff0c;形成高内聚低耦合的结构) XAML是一种…

Paimon下载使用和基础操作说明

简介 Apache Paimon 是一种湖格式&#xff0c;支持使用 Flink 和 Spark 构建实时湖仓一体架构 用于流式处理和批处理操作。Paimon创新性地将湖格式与LSM&#xff08;Log-structured merge-tree&#xff09;相结合 结构&#xff0c;将实时流式更新引入 Lake 架构。 Paimon提供以…

AGE agtype 简介

AGE 使用一种名为 agtype 的自定义数据类型&#xff0c;这是 AGE 返回的唯一数据类型。agtype 是 Json 的超集&#xff0c;也是 JsonB 的自定义实现。 简单数据类型 Null 在Cypher中&#xff0c;null用于表示缺失或未定义的值。概念上&#xff0c;null表示“缺失的未知值”&…

Python数据处理之高效校验各种空值技巧详解

概要 在编程中,处理空值是一个常见且重要的任务。空值可能会导致程序异常,因此在进行数据处理时,必须确保数据的有效性。Python 提供了多种方法来处理不同数据对象的空值校验。本文将详细介绍如何对Python中的各种数据对象进行空值校验,并包含相应的示例代码,帮助全面掌握…

力扣 203反转链表

思路 用cur->next指向pre,把链表倒转 cur后移&#xff0c;cur指向原链表的下一个 注意用tmp存储原链表中cur的后一个 class Solution { public: ListNode* reverseList(ListNode* head) { ListNode *cur head; ListNode *pre nullptr; ListNode *tmp; while (cur ! nul…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验18 边界网关协议BGP

一、实验目的 1.验证边界网关协议BGP的作用&#xff1b; 2.学习在思科路由器上该协议的使用方法。 二、实验要求 1.使用Cisco Packet Tracer仿真平台&#xff1b; 2.观看B站湖科大教书匠仿真实验视频&#xff0c;完成对应实验。 三、实验内容 1.构建网络拓扑&#xff1b; …

在小红书用AI做壁纸号,矩阵起号爆卖10000+(详细操作教程)

壁纸号领域一直是一个充满机遇的蓝海项目&#xff0c;由于始终有人对壁纸感兴趣&#xff0c;这种需求永不消逝。 随着AI绘画技术的出现&#xff0c;壁纸的创作更加便捷&#xff0c;不需要自己到处无版权地搬运或者自己动手画&#xff0c;更无需操心版权问题。 零成本、易操作…

羊大师:暑期不“胖”秘籍:羊奶滋养,细嚼慢咽是关键!

夏日炎炎&#xff0c;假期悠长&#xff0c;如何在享受悠闲时光的同时&#xff0c;保持轻盈体态&#xff0c;成了许多人心中的小秘密。今天&#xff0c;就让我们一起揭秘暑期不“胖”的秘籍&#xff0c;让羊奶的滋养与细嚼慢咽的智慧&#xff0c;成为你美丽夏日的守护神。 羊奶轻…

收银系统源码-【满额立减】功能介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

[AI 大模型] Meta LLaMA-2

文章目录 [AI 大模型] Meta LLaMA-2简介模型架构发展新技术和优势示例 [AI 大模型] Meta LLaMA-2 简介 Meta LLaMA-2 是 Meta 推出的第二代开源大型语言模型&#xff08;LLM&#xff09;&#xff0c;旨在为研究和商业应用提供强大的自然语言处理能力。 LLaMA-2 系列模型包括从…

RSRS研报复现——年化21.5%,含RSRS标准分,右偏标准分的Backtrader指标计算(代码+数据)

原创文章第583篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 继续Backtrader&#xff0c;今天讲讲指标扩展。 作为规则型的量化框架&#xff0c;指标是非常重要的元素&#xff0c;它是策略的基础。 我们来扩展一个经典的指标&#xff0c;RSR…

ESP-NOW无线通信

ESP-NOW无线通信 ESP-NOW无线通信协议简介ESP-NOW单向通信ESP-NOW双向通信ESP32的MAC地址总结 ESP-NOW无线通信协议简介 ESP-NOW 是由Espressif开发的基于数据链路层的无线通信协议&#xff0c;它将五层 OSI 上层协议精简为一层&#xff0c;数据传输时无需依次经过网络层、传输…

气膜体育馆的空气质量控制系统智能化管理—轻空间

随着科技的不断进步&#xff0c;气膜体育馆在全球范围内得到了广泛应用。一个重要的原因是其先进的空气质量控制系统&#xff0c;这不仅提高了场馆内部环境的舒适度&#xff0c;也保障了使用者的健康安全。轻空间将详细探讨气膜体育馆的空气质量控制系统是如何实现智能化管理的…

教师管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;教师管理&#xff0c;个人认证管理&#xff0c;课程信息管理&#xff0c;课堂记录管理&#xff0c;课堂统计管理&#xff0c;留言板管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;课程信息…

Web知识库应用程序LibreKB

什么是 LibreKB &#xff1f; LibreKB 是一款知识库 Web 应用程序。免费、开源、自托管&#xff0c;基于 PHP/MySQL。 官方并没有 Docker 镜像&#xff0c;老苏这次图省事&#xff0c;并没有像往常一样构建一个镜像&#xff0c;而是基于 Docker 搭建了一个 LAMP 环境&#xff0…

警惕!焦虑过度的这些症状正在悄悄侵蚀你的生活!

在快节奏的现代社会中&#xff0c;焦虑已成为许多人生活的一部分。适度的焦虑可以激发我们的斗志&#xff0c;推动我们前进。然而&#xff0c;当焦虑过度时&#xff0c;它可能会变成一把双刃剑&#xff0c;对我们的身心健康造成严重威胁。本文将探讨焦虑过度的表现&#xff0c;…

【Python进阶】拷贝、闭包、装饰器,函数分类

目录 一、对象属性和类属性 1、对象属性 2、类属性 二、类方法和静态方法 1、类方法 2、静态方法 3、扩展综合案例 三、深拷贝和浅拷贝 1、浅拷贝 2、深拷贝 3、浅拷贝和深拷贝的区别 四、函数知识 1、函数的定义与调用 2、函数名记录的是引用 3、函数名当作参数…

记录|C#安装+HslCommunication安装

记录线索 前言一、C#安装1.社区版下载2.VS2022界面设置 二、HslCommunication安装1.前提2.安装3.相关文件【重点】 更新记录 前言 初心是为了下次到新的电脑上安装VS2022做C#上机位项目时能快速安装成功。 一、C#安装 1.社区版下载 Step1. 直接点击VS2022&#xff0c;跳转下…

apksigner安装

apksigner安装 下载cmdline-tools获取SDK 组件如果发生报错&#xff1a;Error: Could not determine SDK root.Error: Either specify it explicitly with --sdk_root or move this package into its expected location: <sdk>\cmdline-tools\latest\&#xff0c;并把 安…

首月免月租,手机卡首月免月租什么意思?

手机卡首月免月租是真的吗&#xff1f;只有首月免吗&#xff1f;最近有不少小伙伴来咨询首月免月租这件事了&#xff0c;今天这篇文章就给大家解开这个疑惑。 话不多说&#xff0c;下面让我们直接进入正题&#xff1a; 首先&#xff0c;三大运营商的卡一般只有移动和电信的套餐…