CF1446C Xor Tree 题解 DP Trie树

news2024/11/17 2:58:36

Xor Tree

传送门

题面翻译

给定你一个非负整数序列 a a a,保证其中每个数两两不同。
对于每个 a i a _ i ai,它会向 j ≠ i j \ne i j=i a i ⊕ a j a_i\oplus a_j aiaj ⊕ \oplus 代表异或)最小的 a j a _ j aj 连双向边。
如果 a j a _ j aj 也向 a i a _ i ai 连了边,只算一条边。现在要让你删去序列中的一些数,使得最后形成的图是一颗树,输出最少需要删除几个数。

Translated by 试试事实上吗.

题目描述

For a given sequence of distinct non-negative integers ( b 1 , b 2 , … , b k ) (b_1, b_2, \dots, b_k) (b1,b2,,bk) we determine if it is good in the following way:

  • Consider a graph on k k k nodes, with numbers from b 1 b_1 b1 to b k b_k bk written on them.
  • For every i i i from 1 1 1 to k k k : find such j j j ( 1 ≤ j ≤ k 1 \le j \le k 1jk , j ≠ i j\neq i j=i ), for which ( b i ⊕ b j ) (b_i \oplus b_j) (bibj) is the smallest among all such j j j , where ⊕ \oplus denotes the operation of bitwise XOR (https://en.wikipedia.org/wiki/Bitwise_operation#XOR). Next, draw an undirected edge between vertices with numbers b i b_i bi and b j b_j bj in this graph.
  • We say that the sequence is good if and only if the resulting graph forms a tree (is connected and doesn’t have any simple cycles).

It is possible that for some numbers b i b_i bi and b j b_j bj , you will try to add the edge between them twice. Nevertheless, you will add this edge only once.

You can find an example below (the picture corresponding to the first test case).

Sequence ( 0 , 1 , 5 , 2 , 6 ) (0, 1, 5, 2, 6) (0,1,5,2,6) is not good as we cannot reach 1 1 1 from 5 5 5 .

However, sequence ( 0 , 1 , 5 , 2 ) (0, 1, 5, 2) (0,1,5,2) is good.

You are given a sequence ( a 1 , a 2 , … , a n ) (a_1, a_2, \dots, a_n) (a1,a2,,an) of distinct non-negative integers. You would like to remove some of the elements (possibly none) to make the remaining sequence good. What is the minimum possible number of removals required to achieve this goal?

It can be shown that for any sequence, we can remove some number of elements, leaving at least 2 2 2 , so that the remaining sequence is good.

输入格式

The first line contains a single integer n n n ( 2 ≤ n ≤ 200 , 000 2 \le n \le 200,000 2n200,000 ) — length of the sequence.

The second line contains $ n $ distinct non-negative integers a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an ( 0 ≤ a i ≤ 1 0 9 0 \le a_i \le 10^9 0ai109 ) — the elements of the sequence.

输出格式

You should output exactly one integer — the minimum possible number of elements to remove in order to make the remaining sequence good.

样例 #1

样例输入 #1

5
0 1 5 2 6

样例输出 #1

1

样例 #2

样例输入 #2

7
6 9 8 7 3 5 2

样例输出 #2

2

提示

Note that numbers which you remove don’t impact the procedure of telling whether the resulting sequence is good.

It is possible that for some numbers b i b_i bi and b j b_j bj , you will try to add the edge between them twice. Nevertheless, you will add this edge only once.

以上来自洛谷 以上来自洛谷 以上来自洛谷

解题思路

可将问题转换为转化为求最大保留数,令只存在一对 ( i , j ) (i,j) (i,j) 对彼此而言 a i ⊕ a j a_i\oplus a_j aiaj 的值都是最小的。

自然想到 Trie 树。(不会 Trie 树?看这里。)把所有数插入进 Trie 树里,递归考虑 Trie 树的一棵子树 x x x,记令子树 x x x 合法的最大保留数为 f x f_x fx,子树 x x x 的左右儿子对应的是二进制意义下的第 k k k 位。

当子树 x x x 只存在左或右儿子时, f x f_x fx 的值就是左右儿子的值,否则就是 max ⁡ ( L e f t S o n . f , R i g h t S o n . f ) + 1 \max(LeftSon.f,RightSon.f)+1 max(LeftSon.f,RightSon.f)+1。因为在第 k k k 位之前,对应位的值都相同,仅第 k k k 位不相同,保留左右子树中的一棵,再保留其余子树的一个节点,就能确保当前子树内只存在一对上述的 ( i , j ) (i,j) (i,j)。最后答案就是 n − f r t n−f_{rt} nfrt

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int Maxn = 2e5 + 5;
int n, a[Maxn];
int rt, cnt;
int tong[4000005][2];
inline void Inst(int val) {
	int tmp = rt, cur;
	for (int i = 30; i >= 0; i--) {
		cur = val >> i & 1;
		if (!tong[tmp][cur]) {
			cnt += 1;
			tong[tmp][cur] = cnt;
		}
		tmp = tong[tmp][cur];
	}
}
inline int Fac(int tmp) {
	if (!tong[tmp][0] && !tong[tmp][1]) {
		return 1;
	}
	if (!tong[tmp][0]) {
		return Fac(tong[tmp][1]);
	}
	if (!tong[tmp][1]) {
		return Fac(tong[tmp][0]);
	}
	return max(Fac(tong[tmp][0]), Fac(tong[tmp][1])) + 1;
}
inline void work() {
	rt = cnt = 1;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		Inst(a[i]);
	}
	cout << n - Fac(rt) << endl;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	work();
	return 0;
}

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

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

相关文章

IntelliJ IDEA - 快速去除 mapper.xml 告警线和背景(三步走)

1、去掉 No data sources configure 警告 Settings&#xff08;Ctrl Alt S&#xff09; ⇒ Editor ⇒ Inspections ⇒ SQL ⇒ No data sources configure 2、去掉 SQL dialect is not configured 警告 Settings&#xff08;Ctrl Alt S&#xff09; ⇒ Editor ⇒ Inspecti…

C++力扣题目450--删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#xff1a; 首先…

Ansible Filter滤波器的使用

一、【说在前面】 Ansible Filter一般被称为滤波器或者叫过滤器。 这个东西初次听到以为是什么科学计算的东西&#xff0c;但是想来ansible不太可能有什么滤波操作&#xff0c;所以这个东西本质是一个数值筛选器&#xff0c;内置函数&#xff0c;本质是一个为了做区别化的工具…

【杂谈】经验分享:宝塔快速部署与IDEA远程Debug

文章目录 前言&需求描述1. 宝塔部署后端项目1.1 项目准备1.2 服务器准备1.3 项目启动 2. IDEA 远程 debug2.1 IDEA 编辑启动项2.2 服务器带参启动2.3 debug 演示 3. 补充与总结3.1 补充3.2 总结 宝塔部署项目 与 IDEA 远程debug 实战 前言&需求描述 本文记录个人工作…

Vue中的v-model

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介基本用法文本输入框复选框下拉框 原理解析文本输入框的原理复选框和下拉框的原理 ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 V…

动态规划篇-06:单词拆分

139、单词拆分 老样子&#xff0c;还是先尝试找出状态转移方程 状态转移方程 对问题进行分解&#xff0c;尝试从子问题入手解决。这也是前文提到过的 “分解问题” 的思想 对于输入的字符串 s&#xff0c;如果我能够从单词列表 wordDict 中找到一个单词匹配 s 的前缀 s[0..k]…

实现零的突破--国内首款兼容6Pin光耦栅极驱动器SLM34x系列SLM341

SLM34x系列SLM341是单通道兼容光耦的隔离式栅极驱动器产品&#xff0c;适用于驱动IGBT、MOSFET。其峰值驱动电流3.0A以及有不同的UVLO电压。与光耦栅极驱动器相比&#xff0c;其性能和可靠性都得到显著的提升&#xff0c;同时保持了对光耦栅极隔离驱动器管脚的兼容。性能提升包…

喜报|盘古信息入选多市中小企业数字化转型试点城市牵引单位/服务商名单

近期&#xff0c;为深入贯彻落实党中央、国务院关于支持中小企业创新发展、加快中小企业数字化转型系列决策部署&#xff0c;财政部、工业和信息化部近日联合印发通知&#xff0c;组织开展中小企业数字化转型城市试点工作&#xff0c;东莞市、武汉市、南昌市等多地经济和信息化…

国科大-自然语言处理复习

自然语言处理复习 实体关系联合抽取流水线式端到端方法 检索式问答系统流水线方式信息检索&#xff08;IR&#xff09;阶段阅读理解&#xff08;RC&#xff09;阶段基于证据强度的重排基于证据覆盖的重排结合不同类型的聚合 端到端方式Retriever-Reader的联合学习基于预训练的R…

科创板涨跌幅限制20%,上海怎么开参考表账户佣金费率最低?万一是哪家证券公司?

科创板是中国证券市场上的一类创新性企业板块&#xff0c;全称为科技创新板。科创板以支持科技创新和高新技术产业为目标&#xff0c;主要面向科技创新型企业和高新技术企业。科创板的设立旨在为创新型企业提供更加灵活、开放、市场化的融资和退出机制&#xff0c;以加快科技创…

【软件测试学习笔记1】测试基础

1.软件测试的定义 软件的定义&#xff1a;控制计算机硬件工作的工具 软件的基本组成&#xff1a;页面客户端&#xff0c;代码服务器&#xff0c;数据服务器 软件产生的过程&#xff1a;需求产生&#xff08;产品经理&#xff09;&#xff0c;需求文档&#xff0c;设计效果图…

怎样获取power shell 的全部可用命令?3/5(篇幅有点长,分成5份)

在power shell 窗口中&#xff0c;有一个获取全部可用命令的命令&#xff1a;get-command&#xff0c;获取到的命令有1640多个&#xff0c;够学习了吧&#xff1f;那么&#xff0c;power shell 命令有哪些类别呢&#xff1f; PowerShell命令可以分为以下几类&#xff1a; Cmd…

使用composer构建软件包时文件(夹)权限设置

在构建软件包的时候你可能会需要对包源内文件或文件夹的权限做出相应的调整&#xff0c;以确保软件包在部署到客户端后可以正常运行。在此之前我们先来了解一下Apple文件系统内文件或文件夹的权限设定。 常见的文件或文件夹会有Owner, Group, Everyone这三种类型的所有权&#…

经典文献阅读之--TwinLiteNet(可行驶区域和车道分割的高效轻量级模型)

0. 简介 对于自动驾驶来说语义分割是自动驾驶中理解周围环境的一项常见任务。可行驶区域分割和车道检测对于道路上安全且高效的导航尤为重要。为了满足自动驾驶汽车中可行驶区域和车道分割的高效轻量级&#xff0c;《TwinLiteNet: An Efficient and Lightweight Model for Dri…

反射助你无痛使用Semantic Kernel接入离线大模型

本文主要介绍如何使用 llama 的 server 部署离线大模型&#xff0c;并通过反射技术修改 Semantic Kernel 的 OpenAIClient 类&#xff0c;从而实现指定端点的功能。最后也推荐了一些学习 Semantic Kernel 的资料&#xff0c;希望能对你有所帮助。 封面图片&#xff1a; Dalle3 …

JVM篇--Java内存区域高频面试题

java内存区域 1 Java 堆空间及 GC&#xff1f; 首先我们要知道java堆空间的产生过程&#xff1a; 即当通过java命令启动java进程的时候&#xff0c;就会为它分配内存&#xff0c;而分配内存的一部分就会用于创建堆空间&#xff0c;而当程序中创建对象的时候 就会从堆空间来分…

图像处理-像素位置的一阶导数和二阶导数

图像处理-像素位置的一阶导数和二阶导数 空间卷积是一种图像处理中常用的技术&#xff0c;用于计算图像中每个像素位置的一阶导数和二阶导数。在这里将解释如何使用卷积操作来实现这些导数的计算。 一阶导数和二阶导数的性质&#xff1a; 一阶导数通常产生粗边缘&#xff1b…

redis原理(二)数据结构

redis可以存储键与5种不同数据结构类型之间的映射&#xff1a; String类型的底层实现只有一种数据结构&#xff0c;也就是动态字符串。而List、Hash、Set、ZSet都由两种底层数据结构实现。通常我们把这四种类型称为集合类型&#xff0c;它们的特点是一个键对应了一个集合的数据…

小程序系列--6.全局配置

一. 全局配置文件及常用的配置项 二、window 1. 小程序窗口的组成部分 2. 了解 window 节点常用的配置项 3. 设置导航栏的标题 4. 设置导航栏的背景色 5. 设置导航栏的标题颜色 6. 全局开启下拉刷新功能 7. 设置下拉刷新时窗口的背景色 8. 设置下拉刷新时 loading 的样…

【Python数据可视化】matplotlib之绘制高级图形:散点图、热力图、等值线图、极坐标图

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…