首页 > 其他分享 >abc321E - Complete Binary Tree

abc321E - Complete Binary Tree

时间:2023-09-25 23:34:08浏览次数:44  
标签:Binary ll Tree abc321E 端点 iint include define

E - Complete Binary Tree

首先我们只考虑x子树中的答案,非常明显,一定是一个连续的区间,那么我们只需要找到两个端点即可,左端点一直往左走即可,但是右端点要注意,如果走不了,如果左端点存在,说明n就是我们的右端点。

处理完子树之后往上跳即可,因为树高只有60

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define fo(i,a,b) for (ll (i)=(a);(i)<=(b);(i)++)
#define fd(i,b,a) for (int (i)=(b);(i)>=(a);(i)--)
#define mk(x,y) make_pair((x),(y))
#define lc ( iint(2)*x )
#define rc ( iint(2)*x+iint(1) )
using namespace std;
typedef double db;
typedef long long ll;
typedef __int128 iint;
const int N =1e6+6;
const ll mo=998244353;
const ll inf=1ll<<60;
ll nn,xx,kk;
iint n,x,k,l,r,lx;
void dg(iint x,iint k,int op){
	if (!k) {
		l=min(l,x);
		r=max(r,x);
		return;
	}
	if (!op) {
		if (lc<=n) dg(lc,k-1,op);
	}
	else{
		if (rc<=n) dg(rc,k-1,op);
		else r=n;
	}
}
void solve(){
	ll ans=0;
	n=nn; x=xx; k=kk;
	
	if (!k) {
		printf("%d\n",1);
		return;
	}
	
	l=inf; r=0;
	
	dg(x,k,0);
	dg(x,k,1);

	
	if (l<=r) ans+=r-l+(iint)1;
	lx=x;
	
	x/=(iint)2; k--;
	
	while (x) {
		if (!k) {
			ans++; break;
		}
		l=inf; r=0;
		
		if (lc!=lx && lc<=n) dg(lc,k-1,0),dg(lc,k-1,1);
		if (rc!=lx && rc<=n) dg(rc,k-1,0),dg(rc,k-1,1);
		
		if (l<=r) ans+=r-l+1ll;
		
		k--;
		lx=x;
		x/=2ll;
		
	}
	printf("%lld\n",ans);
}
int main()
{
//	freopen("data.in","r",stdin);
	
	int T;
	scanf("%d",&T);
//	T=1;
	while (T--){
		scanf("%lld %lld %lld",&nn,&xx,&kk);
		solve();
	}
	return 0;
}

 

标签:Binary,ll,Tree,abc321E,端点,iint,include,define
From: https://www.cnblogs.com/ganking/p/17729127.html

相关文章

  • 使用Vue3+elementPlus的Tree组件实现一个拖拽文件夹管理
    目录1、前言2、分析3、实现4、踩坑4.1、拖拽辅助线的坑4.2、数据的坑4.3、限制拖拽4.4、样式调整1、前言最近在做一个文件夹管理的功能,要实现一个树状的文件夹面板。里面包含两种元素,文件夹以及文件。交互要求如下:创建、删除,重命名文件夹和文件可以拖拽,拖拽文件到文件夹中,或......
  • zTree使用记录
    <linkhref="zTree/zTreeStyle/zTreeStyle.css"rel="stylesheet"/><divid="treeDemo"class="ztree"></div><scriptsrc="zTree/jquery.ztree.all.js"type="text/javascript"><......
  • module开发过程tree_ shaking
    module开发过程tree_shakingmodule开发可以实现tree-shaking注意事项❓:什么情况下就会tree-shaking?......
  • CF1710D Recover the Tree
    题目链接一个比较显然的思路就是:我们按照右端点从小到大的顺序(右端点相同按左端点从大到小)去考虑每个好的区间。由于是连通性问题,不难想到用并查集去实时维护连通性。根据定义,一个好的区间必定对应了一个连通块;我们考虑的是好的区间,所以当前并查集中的每个连通块必定都是一个区......
  • [abc321E]Complete Binary Tree
    2023-09-23题目题目传送门翻译翻译难度&重要性(1~10):6题目来源AtCoder题目算法模拟解题思路考场没调出来,考完赶紧写发题解祭奠一下。这道题主要就是模拟,细节比较多。思路就是一层一层的计算贡献:如图,我们首先计算出以结点\(x\)为根的子树第\(k\)层的结点数,再计......
  • 2023湖南省赛 E.ytree (线段树)
    传送门大致思路:1.将操作1拆分为两个部分x(-1)^d+kd(-1)^d。对于操作1中的x(-1)^d部分而言。我们可以对式子进行拆分,把x拆出来,我们会发现和v号点距离为奇数的点会减去x,为偶数的点会加上x,所以我们可以在线段树上用一个sum1维护应该减去的值,sum2维护加上的值即可。2.随即就是......
  • E - Complete Binary Tree
    E-CompleteBinaryTree完全二叉树三个值N,X,K,分别表示点的个数,点的编号,求到X点的距离为K点的个数。首先,我们对以X为根的子树进行分析,可以知道到X点距离为K的点的个数为2^k。这里需要特判,深度为K时最左边的编号不能大于N,点的个数就等于min(r,n)-l+1。然后再对它的父亲进行......
  • pyqt5-QTreeWidgetItem
    QTreeWidgetItem树节点项。QTreeWidgetItem(strings:Iterable[str],type:int=QTreeWidgetItem.Type)创建节点时,必须是Iterable[str],表示一行中各列的文本 1、子节点child(self,index:int)->QTreeWidgetItem获取某节点的某子节点childCount(self)->int获......
  • pyqt5-QTreeWidget
    QTreeWidget树组件。1、顶级项addTopLevelItem(self,item:QTreeWidgetItem)末尾添加单个顶级项addTopLevelItems(self,items:Iterable[QTreeWidgetItem])末尾批量添加顶级项insertTopLevelItem(self,index:int,item:QTreeWidgetItem)指定索引插入单个顶级项......
  • Codeforces 1868D. Flower-like Pseudotree
    题目链接:D-Flower-likePseudotree题目大意:给定度数数组\({d_n}\),要求构造一个\(n\)个点\(n\)条边的连通图(也就是基环树),允许有重边,但不能有自环。需要满足第\(i\)个点的度数恰好为\(d_i\),并且将环上的边全部删去后,剩下的每棵树的高度(以原先在环上的点为根)相同。首先考......