首页 > 其他分享 >CF1446C Xor Tree

CF1446C Xor Tree

时间:2024-09-25 09:37:39浏览次数:1  
标签:Xor val int Tree pos ret -- CF1446C dp

很有意思的题目,我们考虑能连边的两个数一定是在 01-Trie 上距离最近的两个点。于是我们先把所有数插入到 01-Trie 上去,然后 \(dp_u\) 考虑以 \(u\) 为根的子树中最多能留几个数,他的两个儿子内部的点只能在内部转移,你只能取一个儿子和另一个儿子的一个,也就是说我们的转移为 \(dp_u = \max(dp_{lson}, dp_{rson}) + 1\)

const int M = 30;
const int N = 2e5 + 5;
int n, a[N]; 

struct Trie {
	int t[N * M][2], ed[N * M], dp[N * M], tot;
	inline void clear(void) {
		for (int i = 0; i <= tot; i++) t[i][0] = t[i][1] = ed[i] = dp[i] = 0;
		tot = 0;
	}
	
	Trie(void) { clear(); }
	inline void insert(int val) {
		int pos = 0;
		for (int i = M; i >= 0; i--) {
			int b = val >> i & 1;
			if (!t[pos][b]) t[pos][b] = ++tot;
			pos = t[pos][b];
		}
		ed[pos]++;
	}
	
	inline void remove(int val) {
		int pos = 0;
		for (int i = M; i >= 0; i--) {
			int b = val >> i & 1;
			if (!t[pos][b]) break;
			pos = t[pos][b];
		}
		if (ed[pos]) ed[pos]--;
	}
	
	inline int query_min(int val) {
		int pos = 0, ret = 0;
		for (int i = M; i >= 0; i--) {
			int b = val >> i & 1;
			if (t[pos][b]) pos = t[pos][b];
			else if (t[pos][1 - b]) ret = ret | (1 << i), pos = t[pos][1 - b];
			else break;
		} return ret;
	}
	
	inline int query_max(int val) {
		int pos = 0, ret = 0;
		for (int i = M; i >= 0; i--) {
			int b = val >> i & 1; b = 1 - b;
			if (t[pos][b]) pos = t[pos][b];
			else if (t[pos][1 - b]) ret = ret | (1 << i), pos = t[pos][1 - b];
			else break;
		} return ret;
	}
	
	inline void dfs(int pos) {
		int l = t[pos][0], r = t[pos][1];
		if (l) dfs(l), chkmax(dp[pos], dp[l]);
		if (r) dfs(r), chkmax(dp[pos], dp[r]);
		if (l && r) dp[pos]++;
		if (ed[pos]) dp[pos] = 1;
	}
} T;

signed main(void) {
	read(n);
	for (int i = 1; i <= n; i++) read(a[i]), T.insert(a[i]);
	T.dfs(0); writeln(n - T.dp[1]);
	//fwrite(pf, 1, o1 - pf, stdout);
	return 0;
}

标签:Xor,val,int,Tree,pos,ret,--,CF1446C,dp
From: https://www.cnblogs.com/EternalEpic/p/18430617

相关文章

  • windows rb_tree动画
    #defineUNICODE#include<windows.h>#include<windowsx.h>#include<stdbool.h>#include<stdio.h>typedefstructball_tball_t;structball_t{intsrc_x;intsrc_y;inttarget_x;inttarget_y;};constintWI......
  • 大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(正在更新···)章节内容上节我们完成了如下的内容:MergeTree实测案例Re......
  • 大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记 分区 索引
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(正在更新···)章节内容上节我们完成了如下的内容:MergeTree存储结构Me......
  • AT_jsc2021_g Spanning Tree 题解
    感觉自己稍微有一点唐了。思路我们首先可以把一定要连的边连起来。这样就变成了一个无向图生成树计数问题。如何求解。使用矩阵树定理!我们可以求出基尔霍夫矩阵,然后跑一遍行列式就可以了。时间复杂度:\(O(n^3)\)。Code#include<bits/stdc++.h>usingnamespacestd;con......
  • 题解:CF888G Xor-MST
    题解:CF888GXor-MST题目大意:给定\(n\)个点的点权,任意两点间边权是点权的异或和。求这张完全图的MST的权值。思路:Boruvka+Trie树+按位贪心。关键就在于如何求出Boruvka中的best数组。考虑对点权建trie树,对于节点\(i\)本轮的连边,就是找“和它最相似”的那......
  • CF2006A Iris and Game on the Tree
    题目链接题解知识点:贪心,博弈论。一个\(01\)串中\(01,10\)的个数差只与首尾两个字符相关,若首尾字符相同,则个数差为\(0\),否则为\(1\)或\(-1\)。因此,树上除了根节点和叶子节点的\(?\)是不影响叶子节点权值的(但可能影响策略,导致答案不一样),我们只需要考虑叶子节点和根......
  • 二叉搜索树(BSTree)原理及应用场景
    目录引言二叉搜索树的基本概念常见算法插入节点查找节点删除节点二叉搜索树的应用场景1.数据库索引2.符号表3.字典和词汇表4.动态集合结论引言二叉搜索树(BinarySearchTree,BST)是一种特殊的二叉树,其每个节点的值都大于其左子树中的所有节点的值,同时小于......
  • 【小沐学GIS】基于Openstreetmap创建Sionna RT场景(Python)
    文章目录1、简介1.1blender2、下载和安装2.1Python2.2jupyter3、运行结语1、简介1.1blenderhttps://www.blender.org/Blender是一款免费开源的3D创作套件。使用Blender,您可以创建3D可视化效果,例如静态图像、3D动画、VFX(视觉特效)快照和视频编辑。它非常适......
  • PAT甲级-1086 Tree Traversals Again
    题目 题目大意题目给出二叉树的节点个数,并给出用栈遍历树的过程。要求输出树的后序遍历,不能有多余空格。思路可以看出,栈遍历输出的是树的中序遍历,而依次push进栈的是先序遍历的顺序。题目要求后序,即已知先序和中序遍历,求后序遍历。可以先依次遍历先序,例如从先序第一个......
  • CRICOS Data Structures and Algorithms Trees
    DataStructuresandAlgorithmsTreesPage1of3CRICOSProvideCode:00301JNote:DSATreeNodehasalreadybeenwrittenforyou,butyou’llneedtounderstandandtestit.Thecodeforfind()wasalreadyimplementedforyou-insert()anddelete()are......