CF1438F - Olha and Igor

该博客介绍了如何在完全二叉树中高效地处理关于最近公共祖先(LCA)的询问。通过分析LCA的性质,提出在随机询问后统计节点出现次数来确定根节点的方法,并在O(n)时间内找到根节点的两个儿子。内容涉及树的遍历、询问优化及统计策略,适合对数据结构和算法感兴趣的读者深入理解。

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

交互题.
给定一棵完全二叉树,树高为 h , n = 2 h − 1 h,n=2^h-1 h,n=2h1.
现在你不知道每个点的位置,但是你可以进行 n + 420 n+420 n+420次询问.
询问格式为 ? x y z,返回当 z z z为根时 x , y x,y x,y L C A LCA LCA.
现在让你回答根的标号.
h ∈ [ 3 , 18 ] h\in [3,18] h[3,18]

参考 C F CF CF官方题解.

这道题让我重新认识了 L C A LCA LCA.
z z z为根, L C A ( x , y ) LCA(x,y) LCA(x,y)是到 x , y , z x,y,z x,y,z距离和最小的点.(证明显然…)
所以询问 x , y , z x,y,z x,y,z的顺序是无关紧要的.

我们考虑 m i d = a s k ( x , y , z ) ∉ { x , y , z } mid=ask(x,y,z)\notin\{x,y,z\} mid=ask(x,y,z)/{x,y,z}的情况.
我们考虑每个点作为 m i d mid mid能被多少个三元组得到.
显然设 s 1 , s 2 , s 3 s1,s2,s3 s1,s2,s3 m i d mid mid三个子树的大小.(不足时补0).
那么 c o u n t ( m i d ) = s 1 ∗ s 2 ∗ s 3 count(mid)=s1*s2*s3 count(mid)=s1s2s3.

显然根和叶子的 c o u n t = 0 count=0 count=0,且容易发现深度相同 c o u n t count count相等.
而深度为 i i i的点( i ≠ 1 , i ≠ h ) i\ne 1,i\ne h) i=1,i=h) c o u n t = ( 2 h − i − 1 ) 2 ( 2 h − 2 h − i + 1 ) count=(2^{h-i}-1)^2(2^h-2^{h-i+1}) count=(2hi1)2(2h2hi+1).
显然和为定值,积在尽量相等的时候取最大,所以根的儿子处取到最大值.

所以我们可以随机 420 420 420次,然后统计 a s k ( x , y , z ) ask(x,y,z) ask(x,y,z)的出现次数.
出现次数最大的俩个为根的两个儿子.
然后再 O ( n ) O(n) O(n)枚举根即可.


int h, n, cnt[T], p[T];

V<int> e[T];
#define pb push_back
void ins(int x,int y) {e[x].pb(y); e[y].pb(x);}

#define op false

int fa[T],dep[T],c;

void dfs(int x) {
	c++;
	for(int y:e[x]) if(fa[x] ^ y) 
		fa[y]=x,dep[y]=dep[x]+1,dfs(y);
}

int ask(int x,int y,int z) {
	if(x == y) return x;
	if(x == z) return z;
	if(y == z) return z;
	if(op) {
		fa[z]=dep[z]=0; c=0;
		dfs(z);
		assert(c == n);
		while(x^y) {
			if(dep[x]<dep[y]) swap(x,y);
			x=fa[x];
		}
		return x;
	}
	printf("? "); pr1(x); pr1(y); pr2(z);
	fflush(stdout); qr(x);
	assert(x>0);
	return x;
}

mt19937 rnd(time(0));
int random(int x) {return rnd()%x+1;}

bool cmp(int x,int y) {return cnt[x]>cnt[y];}

void solve() {
	qr(h); n=(1<<h)-1;
	int rt=-1;
	if(op) {
		FOR(i,n) {
			int x; qr(x);
			if(x) ins(x,i);
			else rt=i;
		}
	}
	FOR(i,420) {
		int x=random(n),y=random(n),z=random(n),w;
		if(x == y || y == z || x == z) {i--; continue;}
		w=ask(x,y,z);
		if(w ^ x && w ^ y && w ^ z) cnt[w]++;
	}
	iota(p+1,p+n+1,1);
	sort(p+1,p+n+1,cmp);
	int x=p[1],y=p[2];
	FOR(i,n) {
		int z=ask(x,y,i);
		if(z ^ x && z ^ y) {
			printf("! %d\n",i);
			if(op) 
				assert(i == rt);
			return ;
		}
	}
}

int main() {
	if(op) freopen("a.in","r",stdin);
    int T = 1;
//    qr(T);
    while (T--)
        solve();
    return 0;
}

内容概要:本文深入探讨了折扣店快消品定价的研究,涵盖快消品与折扣店行业的概述、定价影响因素、定价策略、定价方法、定价技巧及案例分析。快消品行业涉及日常生活用品、食品、饮料等,具有高频次和重复购买的特点。折扣店市场规模不断扩大,主要参与者包括赵一鸣、好特卖等。影响定价的因素包括成本(生产、库存、物流)、市场需求(规模、购买力、需求弹性)、竞争(对手定价策略、市场份额)、产品特性(差异化、品牌形象)、渠道与分销成本、政府政策等。定价策略分为成本导向(成本加成、目标收益)、需求导向(理解价值、需求差异)和竞争导向(随行就市、投标定价)。定价方法包括市场调研、成本加成、竞争比较和价值定价。定价技巧涵盖高价撇脂、渗透定价、价格歧视和捆绑定价。最后通过好特卖、嗨特购、零食很忙的案例分析,展示了不同折扣店的定价策略及其效果。 适合人群:从事快消品行业、折扣店运营的管理人员及对定价策略感兴趣的商业人士。 使用场景及目标:①帮助折扣店管理者了解定价的基本理论和实际操作方法;②为快消品企业提供定价决策支持,优化定价策略;③通过案例分析,提供实际操作中的经验和教训。 其他说明:折扣店在制定快消品定价时,应综合考虑多种因素,灵活运用不同的定价策略和技巧,以应对市场变化,提升竞争力。建议企业定期监控市场动态,分析消费者反馈,不断优化定价方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Infinite_Jerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值