【枚举+01 trie树】CF1658 D2

news2024/9/22 1:58:44

Problem - D2 - Codeforces

题意:

给定一个区间[l, r]和r - l + 1个数,问是否存在一个数 x ,使得这些数异或上 x 之后为[l, r]的一个排列

思路:

这种有关一个集合和异或操作的,都可以试试字典树

我们将所有数插入到字典树中

首先一个结论:若两个数异或 x 不同,那么这两个数本来一定不同

因为这些数异或 x 之后是一个排列,因此这些数原来就不同

如果存在 x ,使得这些数的对 x 的最大异或为 r,最小异或为 l,那么就一定满足条件(因为这些数一定不同)

所以我们可以考虑枚举 x 

但是 x 范围太大

注意到 x 一定满足某个ai使得

ai ^ x = l

但是是哪个 ai 异或了 x 变成 l不确定,所以可以转化成枚举 ai

这样 x = ai ^ l

还有个多样例清空01trie的技巧也可以学一下:

void init() {
	tr[0][0] = tr[0][1] = 0;
	tot = 0;
}
void insert(int x) {
	int p = 0;
	for (int j = 20; j >= 0; j --) {
		int u = ((x >> j) & 1);
		if (! tr[p][u]) {
			tr[tot + 1][0] = tr[tot + 1][1] = 0;
			tr[p][u] = ++tot;
		}
		p = tr[p][u];
	}
	tag[p] = x;
}

Code:

#include <bits/stdc++.h>

using i64 = long long;

using namespace std;

const int N = 5e5 + 10;
const int M = 3e6 + 10;
const int P = 131;

int l, r;
int tot = 0;

int a[N];
int tr[N * 30][2], tag[N];

void insert(int x) {
	int p = 0;
	for (int j = 20; j >= 0; j --) {
		int u = ((x >> j) & 1);
		if (! tr[p][u]) {
			tr[tot + 1][0] = tr[tot + 1][1] = 0;
			tr[p][u] = ++tot;
		}
		p = tr[p][u];
	}
	tag[p] = x;
}
int query_mx(int x) {
	int p = 0;
	for (int j = 20; j >= 0; j --) {
		int u = ((x >> j) & 1);
		if (tr[p][u ^ 1]) {
			p = tr[p][u ^ 1];
		}else {
			p = tr[p][u];
		}
	}
	return tag[p] ^ x;
}
int query_mi(int x) {
	int p = 0;
	for (int j = 20; j >= 0; j --) {
		int u = ((x >> j) & 1);
		if (tr[p][u]) {
			p = tr[p][u];
		}else {
			p = tr[p][u ^ 1];
		}
	}
	return tag[p] ^ x;
}
void init() {
	tr[0][0] = tr[0][1] = 0;
	tot = 0;
}
void solve() {
	cin >> l >> r;
	init();
	for (int i = l; i <= r; i ++) {
		cin >> a[i];
		insert(a[i]);
	}
	for (int i = l; i <= r; i ++) {
		int x = a[i] ^ l;
		if (query_mi(x) == l && query_mx(x) == r) {
			cout << x << "\n";
			break;
		}
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int t = 1;
	cin >> t;
	while(t --) {
		solve();
	}
	return 0;
}

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

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

相关文章

C++ 左值和右值

C 左值和右值 左值、右值左值引用、右值引用std::move()std::move()的实现引用折叠 完美转发forward()的实现函数返回值是左值还是右值如何判断一个值是左值还是右值 左值、右值 在C11中所有的值必属于左值、右值两者之一&#xff0c;右值又可以细分为纯右值、将亡值。在C11中…

Python实现蚁群优化算法,求解旅行商问题

文章目录 蚁群算法蚂蚁的基本变量蚂蚁的优化流程蚁群优化验证与可视化 蚁群算法 蚁群算法是Colori A等人在1991年提出的&#xff0c;通过模仿蚂蚁觅食行为&#xff0c;抽象出信息素这一奖惩机制&#xff0c;从而赋予蚂蚁智能Agent的身份&#xff0c;使之得以在最佳路线问题中大…

Windows环境下Node.js二进制版安装教程

文章目录 前言一 下载Node.js二 设置环境变量三 配置全局安装和缓存路径四 设置仓库 前言 新版的Node.js已自带npm&#xff0c;就在Node.js下载完成解压后的文件内&#xff0c;的node_modules包中。 npm的作用&#xff1a;是对Node.js依赖的包进行管理&#xff0c;类似maven。…

使用 CausalPy 进行因果推理

这篇文章通过一个实际的例子简要介绍了因果推理&#xff0c;这个例子来自于《The Brave and True》一书&#xff0c;我们使用 CausalPy 来实现。 因果推理是从观察数据中估计因果效应的过程。对于任何给定的个体&#xff0c;我们只能观察到一种结果。另一种结果对我们来说是隐藏…

蓝牙ble tips2-UUID GATT(service和CHARACTERISTIC) profile相关概念介绍

服务和特性 低功耗蓝牙设备之间通信&#xff0c;都是基于服务和特性。一个蓝牙设备中可以包含若干个服务&#xff0c;一个服务中可以包含若干个特性&#xff0c;每一个服务或者特性都要有一个UUID。蓝牙的数据交互都是基于一个个特性进行的&#xff0c;数据交互的方式有五种&a…

超全面的高精度行星减速机结构、原理、功能以及优势解析

行星减速机是运动控制系统中连接伺服电机和应用负载的一种机械传动组件&#xff0c;具有高减速比、良好的传动特性、结构紧凑、体积小、重量轻、可靠性高、低噪音等优点&#xff0c;广泛用于电机、汽车、机器人及各种工业机械中&#xff0c;以实现高效率和稳定性。 一、什么是…

Ubuntu20.04安装ROS Noetic 版本安装记录

用的是VMWare的20.04的Ubuntu虚拟机&#xff0c;打算安装一下Noetic 版本的ROS学习一下。B站有个视频可以参考一下&#xff1a;在Ubuntu20.04上安装ROS机器人操作系统-Noetic但是基本也是参考中文文档安装&#xff0c;步骤相比网上的教程更权威Ubuntu install of ROS Noetic&am…

LeetCode--HOT100题(20)

目录 题目描述&#xff1a;48. 旋转图像&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;48. 旋转图像&#xff08;中等&#xff09; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#x…

echarts图表渐变色 + 每个柱子不同颜色设置

echarts柱状图&#xff0c;默认所有柱子都是同一个颜色&#xff0c;显示效果差强人意&#xff0c;本文介绍如果修改成为每个柱子添加不同的颜色&#xff0c;以及如何添加渐变色&#xff0c;丰富图表的显示鲜果。先看效果&#xff1a; 每个柱子颜色不同 每个柱子都有自己的渐变…

【论文阅读】基于 NeRF 的 3D 重建的批判性分析

【论文阅读】基于 NeRF 的 3D 重建的批判性分析 Abstract1. Introduction2. The State of the Art2.1. Photogrammetric-Based Methods2.2. NeRF-Based Methods 3. Analysis and Evaluation Methodology3.1. Proposed Methodology3.2. Metrics3.3. Testing Objects 4. Comparis…

HTML5(H5)的前生今世

目录 概述HTML5与其他HTML的区别CSS3与其他CSS版本的区别总结 概述 HTML5是一种用于构建和呈现网页的最新标准。它是HTML&#xff08;超文本标记语言&#xff09;的第五个版本&#xff0c;于2014年由万维网联盟&#xff08;W3C&#xff09;正式推出。HTML5的前身可以追溯到互联…

[MAUI 项目实战] 手势控制音乐播放器: 动画

吸附动画 还记的上一章节所描述的拖拽物&#xff08;pan&#xff09;和坑&#xff08;pit&#xff09;吗&#xff1f;“”吸附“”这是一个非常拟物的过程&#xff0c;当拖拽物品接近坑区域的边缘时&#xff0c;物体就会由于重力或是引力作用会滑落&#xff0c;吸附在坑里。 …

MINIO安装(centos7)

步骤1&#xff1a;安装wget 在开始安装MinIO之前&#xff0c;需要安装wget命令行工具。可以使用以下命令在CentOS系统中安装wget&#xff1a; sudo yum install wget 步骤2&#xff1a;下载MinIO wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio 将下…

最新[新手入门教程] JDK8u381的下载安装以及环境变量的配置

JAVA从入门到精通 各位新手们大家好&#xff0c;今天来为大家介绍一下JDK8u381的下载安装以及环境变量的配置 【前言】 1.是不是不知道什么是Java&#xff1f; 官方定义&#xff1a; Java是一门面向对象的高级编程语言&#xff0c;不仅吸收了C语言的各种优点&#x…

硬盘格式化后能恢复数据吗?这4个方法可以帮到你!

“前几天一不小心对硬盘进行了格式化操作&#xff0c;但是我很多重要的文件都保存在里面了呀&#xff01;硬盘格式化之后还能进行恢复吗&#xff1f;快帮帮我&#xff01;” 硬盘格式化会将存储在硬盘上的数据全部清除&#xff0c;并将文件系统重置为初始状态。那么&#xff0c…

根据省市区名字发送请求

思路 选择对应的区域其实是按照表格中的省市区的名字进行匹配 读取文件后对应的字典为&#xff1a; {台湾: {},新疆: {},港澳: {中国澳门: [凼仔岛, nan]},西藏: {昌都地区: [卡若区], 那曲地区: [nan]} } 字典解释例如 市区为空&#xff0c;就是选择省下面的全部市和区 区为空…

租赁小程序系统:为您的租赁业务带来便利与效率

租赁小程序开发适合的产品有很多种&#xff0c;下面我将介绍一些常见的产品。   租赁共享单车&#xff1a;共享单车在城市里越来越受欢迎&#xff0c;租赁小程序可以方便用户查找附近的共享单车、预订、支付和解锁等操作。   租房&#xff1a;租赁小程序可以帮助房东发布房…

2023最难就业年

跟大家正式介绍一下我自己。 本人曾在阿里&#xff0c;硅谷工作&#xff0c;百万年薪&#xff0c;大概15的工作经验&#xff0c;八年面试官经验。 前端&#xff0c;后端&#xff0c;产品&#xff0c;测试&#xff0c;运维&#xff0c;PM&#xff0c;架构&#xff0c;运营等岗…

支持北斗三、抗干扰、无高度限制的动态高精度测速北斗定位模块

为室外位置服务提供经纬度信息的GPS模块、北斗定位模块多数受限于速度&#xff0c;在高动态环境下&#xff0c;无法为车载&#xff0c;船载&#xff0c;机载等设备提供精准位置信息。为满足高动态及高速应用场景的位置服务需求&#xff0c;现SKYLAB推出一款支持北斗三&#xff…

时间复杂度接近O(n)的三种排序算法

1.桶排序 桶排序&#xff0c;顾名思义&#xff0c;会用到“桶”&#xff0c;核心思想是将要排序的数据分到几个有 序的桶里&#xff0c;每个桶内的数据再单独进行排序。桶内排完序之后&#xff0c;再把每个桶内的数据按照顺序依次 取出&#xff0c;组成的序列就是有序的了。 …