首页 > 编程语言 >2022 年上海市大学生程序设计竞赛 - 十月赛 B. Questions on Binary Tree

2022 年上海市大学生程序设计竞赛 - 十月赛 B. Questions on Binary Tree

时间:2022-10-26 11:14:59浏览次数:44  
标签:Binary tx int Tree id while Questions ans 节点

给定一棵n个节点的完全二叉树以及m次询问,每次询问需要计算给定节点在先序遍历的顺序。

思路就是从给定的节点不断向上跳,如果当前节点是左儿子则给答案+1,是右儿子则给答案+1+左子树的节点个数。

#include <bits/stdc++.h>
#define int long long
#define pb push_back
using namespace std;
int fpow(int a, int b) {
	int ans = 1;
	for(; b; b >>= 1ll) {
		if(b & (1ll)) ans = ans * a;
		a = a * a;
	}
	return ans;
}
int calc(int n, int id) {//计算n个节点的完全二叉树中以id为根的子树的节点个数
	int ans = 0;
	int tmpl = id, tmpr = id;
	int dep1 = 0, dep2 = 0;
	while(tmpl <= n) {
		tmpl *= 2;
		dep1++;
	}
	tmpl /= 2;
	while(tmpr <= n) {
		tmpr = (tmpr * 2 + 1);
		dep2++;
	}
	tmpr /= 2;
	//如果tmpl和tmpr在同一层
	if(dep1 == dep2) {
		ans = fpow(2, dep1) - 1;
	} else {
		ans = fpow(2, dep1) - 1 - (tmpr * 2 + 1 - n);
	}
	return ans;
}
void solve() {
	int n, m;
	cin >> n >> m;
	int maxdep = 0;
	int tmp = 1;
	while(tmp <= n) {
		tmp *= 2;
		maxdep++;
	}
	int num = n - maxdep + 1;//最后一个点是这一层的第num个
	for(int i = 1; i <= m; i++) {
		//cout << i << endl;
		int x;
		cin >> x;
		int tx = x;
		int delta = 1;
		while(tx != 1) {
			if(tx & 1) {//是父亲节点的右子节点
				delta += calc(n, tx - 1) + 1;//左子节点为根的树的节点个数
			} else {
				delta++;
			}
			tx /= 2;
		}
		cout << delta << endl;
	}
}
signed main() {
	int T = 1;
	//cin >> T;
	while(T--) {
		solve();
	}
	return 0;
}

标签:Binary,tx,int,Tree,id,while,Questions,ans,节点
From: https://www.cnblogs.com/lipoicyclic/p/16827534.html

相关文章

  • CF1092F Tree with Maximum Cost
    题目链接:​​传送门​​是​​这个题​​​的一个变形就是最小值改成最大值懒了直接改了改当时的代码当时的题解里也有解析#include<iostream>#include<cstdio>#inclu......
  • C编程辅导:CS101 Binary Arithmetic
    原文链接:tecdat.cn/?p=29620RequirementInthisAssignment,youshouldwriteaprogramthatallowstheusertoperformsimplearithmeticinbinary.Uponstartin......
  • CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
    CF741DArpa’sletter-markedtreeandMehrdad’sDokhtar-koshpaths给定一颗以\(1\)为根的树每个节点上有一个\(a\simv\)的小写字母,求每个子树内最长的链的长度......
  • web技术分享| 虚拟 tree
    查了好久,觉得使用AntDesignVue中的Tree树形控件因项目需求,节点的移动不通过拖拽移动,需要通过弹窗实现节点的移动,因此基于添加、删除实现。当前仅使用节点添加、删除......
  • web技术分享| 虚拟 tree
    查了好久,觉得使用AntDesignVue中的Tree树形控件因项目需求,节点的移动不通过拖拽移动,需要通过弹窗实现节点的移动,因此基于添加、删除实现。当前仅使用节点添加、删......
  • 7.TreeMap源码解析
    1.数据结构TreeMap的底层数据结构是红黑树,和HashMap的红黑树结构一样。不同的是,TreeMap利用红黑树左节点小,右节点大的性质,根据key进行排序,使每个元素能够插入到红黑树的适......
  • 2.9 复制文件和文件夹 shutil模块 shutil.copy shutil.copytree
    #复制文件:shutil.copy(要复制的文件,要复制文件的位置)#复制文件夹:shutil.copytree(要复制的文件夹,要复制文件夹的位置)-----------------------------------------......
  • PriorityQueue 最小堆&& treemap
    优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(naturalorder......
  • Codeforces 1682 D Circular Spanning Tree
    题意1-n排列,构成一个圆;1-n每个点有个值0或者1,0代表点的度为偶数,1代表点的度为计数;询问能否构成一棵树,树的连边在圆内不会相交,在圆边上可以相交,可以则输出方案。提示1.......
  • loj3885. 「eJOI2022」Bounded Spanning Tree
    草稿:非树边\(u,v,[l,r]\)把\(u,v\)路径上所有边上界与\(r-1\)取个\(\min\)。剩下的边左端点排序后贪心,每次取右端点最小的一个元素。开始只考虑树边。当前加入一......