acm-(交互、随机、完全二叉树、lca)CF Difficult Problems Olha and Igor

本文探讨了使用最低公共祖先(LCA)的概念解决特定问题的方法。通过分析不同节点的属性和三元组(u,v,w)的特性,文章提出了一种高效确定树结构中根节点的有效算法,并详细解释了其背后的数学原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面
传送门
首先有个结论:以 w w w为根的 l c a ( u , v ) lca(u,v) lca(u,v)是到 u , v , w u,v,w u,v,w三点距离和最小的点。结论显然正确,证明略。

我们考虑所有满足 a s k ( u , v , w ) ≠ u , v , w ask(u,v,w)\ne u,v,w ask(u,v,w)=u,v,w的三元组 ( u , v , w ) (u,v,w) (u,v,w),对于 d = a s k ( u , v , w ) d=ask(u,v,w) d=ask(u,v,w)而言,假设有 c n t [ d ] cnt[d] cnt[d]个这样不同的三元组。假设 d e p [ d ] = i , i > 1 dep[d]=i,i>1 dep[d]=i,i>1,注意到 c n t [ d ] cnt[d] cnt[d]就是 d d d的三个支路上的子树的大小的乘积,那么有 c n t [ d ] = ( 2 h − i − 1 ) 2 ( 2 h − 2 h − i + 1 + 1 ) ≈ ( 2 h − i ) 2 ( 2 h − 2 ⋅ 2 h − i ) = x 2 ( 2 h − 2 x ) cnt[d]=(2^{h-i}-1)^2(2^h-2^{h-i+1}+1)\approx (2^{h-i})^2(2^h-2\cdot2^{h-i})=x^2(2^h-2x) cnt[d]=(2hi1)2(2h2hi+1+1)(2hi)2(2h22hi)=x2(2h2x),显然当 x = 2 h − 2 x=2^{h-2} x=2h2的时候取得最大值,也就是说根节点的两个儿子的 c n t cnt cnt是最大的,也就是说随机取三元组,对应的 a s k ( u , v , w ) ask(u,v,w) ask(u,v,w)是根节点儿子的可能性最大。

然后本题的做法就非常简单了,利用上述特性找到根节点两个儿子,然后再 O ( n ) O(n) O(n)遍历所有节点(除了根节点两个儿子本身),看它与根节点的两个儿子的询问值是否为它自己,如果是,说明它是根节点。

mt19937 rnd(time(0));
 
int random(int n){
	return (rnd()%n+n)%n;
}
int qry(int u,int v,int w){
	printf("? %d %d %d\n",u,v,w);
	fflush(stdout);
	scanf("%d",&u);
	if(u==-1)exit(0);
	return u;
}
int cnt[maxn],a[maxn];
bool cmp(int a,int b){
	return cnt[a]>cnt[b];
}
int main(){
	int h,n;
	scanf("%d",&h);
	n=(1<<h)-1;
	FOR(i,1,n+1)a[i]=i;
	FOR(i,0,420){
		int u=random(n)+1,v=random(n)+1,w=random(n)+1;
		if(u==v || u==w || v==w){
			i--;
			continue;
		}
		int as=qry(u,v,w);
		if(as==u || as==v || as==w)continue;
		cnt[as]++;
	}
	int id=0,id2=0;
	sort(a+1,a+1+n,cmp);
	id=a[1],id2=a[2];
	FOR(i,1,n+1){
		if(i==id || i==id2)continue;
		if(qry(i,id,id2)==i){
			printf("! %d\n",i);
			fflush(stdout);
			return 0;
		}
	}
	printf("! 1\n");
	fflush(stdout);
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值