CF888G Xor-MST 01字典树dfs*

news/2024/7/20 21:20:09 标签: 深度优先, 算法, leetcode

link
dfs,mst,01trie,2300
题解写的很清楚,也是看了题解才会做。。

const int maxn = 2e5 + 10;
int n;
int a[maxn];
int nxt[maxn*30][2], cnt = 1;
void insert(int x) {
	int cur = 1;
	for(int i = 30; i >= 0; i--) {
		if(!nxt[cur][(x>>i)&1]) nxt[cur][(x>>i)&1] = ++cnt;
		cur = nxt[cur][(x>>i)&1];
	}
}
ll find(int r1, int r2, int dep) {
	if(dep < 0) return 0;
	ll a1 = -1, a2 = -1;	
	if(nxt[r1][0] && nxt[r2][0]) a1 = find(nxt[r1][0], nxt[r2][0], dep - 1);
	if(nxt[r1][1] && nxt[r2][1]) a2 = find(nxt[r1][1], nxt[r2][1], dep - 1);
	if(~a1 && ~a2) return min(a1, a2);//同取左儿子或右儿子
	if(~a1) return a1;
	if(~a2) return a2;
	if(nxt[r1][1] && nxt[r2][0]) a1 = find(nxt[r1][1], nxt[r2][0], dep - 1) + (1ll<<dep);
	if(nxt[r1][0] && nxt[r2][1]) a2 = find(nxt[r1][0], nxt[r2][1], dep - 1) + (1ll<<dep);
	if(~a1 && ~a2) return min(a1, a2);//只能一边取0一边取1,同时加上1<<dep
	if(~a1) return a1;
	if(~a2) return a2;
	return 0;
}
ll ans;
void dfs(int p, int dep) {
	if(dep < 0) return;
	if(nxt[p][0] && nxt[p][1]) //不要忘记1ll<<dep,因为在dep深度上已经分叉(不同)了。
		ans += find(nxt[p][0], nxt[p][1], dep - 1) + (1ll<<dep);
	if(nxt[p][0]) dfs(nxt[p][0], dep - 1);
	if(nxt[p][1]) dfs(nxt[p][1], dep - 1);
}
void solve() {
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + n + 1);
    n = unique(a + 1, a + n + 1) - a - 1;
    for(int i = 1; i <= n; i++) insert(a[i]);
    dfs(1, 30);
    cout << ans << endl;
}

http://www.niftyadmin.cn/n/1764846.html

相关文章

对于一系列的高速算法设计(不允许使用数组)

题目链接在&#xff1a;针对一群范围对的最快查找算法设计&#xff08;不要用数组&#xff09;。是我眼下遇到的一个较棘手的问题。 描写叙述例如以下&#xff1a; 假如有一群范围对&#xff0c;格式为&#xff1a;<范围表示&#xff0c;该范围相应的结果值>&#xff0c;…

c++作业 时间类time的编写

Link c课作业&#xff0c;写了几万行代码还是第一次写 class &#xff0c;重载 /-//-- 和 cin/cout 什么的还是第一次。 话说提交作业这个平台居然还支持万能头文件&#xff0c;还是要点个赞的。 主要就是注意 friend 和 const 吧&#xff0c; /- 不能像 <,-,.. 一样加 con…

untiy绘制网格mesh

关于绘制网格&#xff0c; 雨松前辈 已经解释的非常的到位&#xff0c;这里我只是搬运工&#xff0c;实在是感觉自己去描述的话不会有雨松大神描述的清楚&#xff0c;该文章循序渐进&#xff0c;一步步引导读者去理解unirty 绘图机制&#xff0c;真的是没有比这个再好得了&…

数据结构课程作业——链表

函数名字功能&#xff1a; //创建长度为n,表头为head的单链表 尾插法 void init_1(link &head, int n); //删除递增顺序链表大于等于mink 小于等于maxk的数 void erase_1(link &head, int mink, int maxk); //输出单链表 void print_1(link &L); //创建长度为n,表…

素数距离问题

描述现在给出你一些数&#xff0c;要求你写出一个程序&#xff0c;输出这些整数相邻最近的素数&#xff0c;并输出其相距长度。如果左右有等距离长度素数&#xff0c;则输出左侧的值及相应距离。 如果输入的整数本身就是素数&#xff0c;则输出该素数本身&#xff0c;距离输出0…

Gym102916J. Lost Island 博弈论

link 第三场训练赛的题目&#xff0c;很有趣的一个博弈问题 不存在 bi0b_i0bi​0 时是关键 题解之后再补吧&#xff0c;今天好忙。 题意 一个岛上的人眼睛颜色有 nnn (n≥2)(n \geq 2)(n≥2) 种&#xff0c;每种有 ai(ai≥1)a_i\ (a_i \geq 1)ai​ (ai​≥1)个&#xff0c;每…

使用Ogre快速渲染视频纹理

基本思路 测试时可使用和视频画面同大小的全屏四边形Rectangle2D,该rect使用动态纹理材质。 渲染时按帧率动态替换该材质的纹理单元为当前帧图像 视频读取 读取每帧视频画面我使用的是OpenCV&#xff0c;类似如下&#xff1a; CvCapture* mCapture cvCreateFileCapture(mFileN…

Gym102916K. Bloodseeker 贪心

Link 贪心 题意 一个吸血鬼 有mmm 滴血的上限&#xff0c;一开始满血&#xff0c;每秒钟会掉一滴血&#xff0c;且可以对一个怪物造成1点伤害,有 nnn个 怪物&#xff0c;每个怪物有 tit_iti​滴血&#xff0c;击杀一个怪物后可以回复 hih_ihi​ 滴血&#xff0c;但是不能超过…