首页 > 其他分享 >CF2040D Non Prime Tree 题解

CF2040D Non Prime Tree 题解

时间:2024-12-09 22:55:59浏览次数:7  
标签:Prime val int 题解 tot times siz CF2040D mxd

CF992Div2 D-solution

给定一个 \(n\) 个节点的树,你可以不重复地给树的节点填 \(1\sim 2n\) 之间的数,求一种构造方案,使得每两个相邻的节点上的数之差的绝对值为合数。

我们规定每次填的数只会变大(就是在以某种方法遍历的时候后面的数一定比前面的数大)。现在我们假设填到了 \(u\) 节点,\(u\) 节点填的数是 \(val_u\),\(u\) 的儿子为 \(v_0,v_1,v_2,\dots\),其中 \(v_0\) 是长儿子任意一个儿子。

现在我们归纳证明,如果每个 \(v\) 子树内最大的数小于 \(val_v+siz_v\times 2 -1\),则存在一种构造方案,使得 \(u\) 子树内最大的数小于 \(val_u+siz_u\times 2-1\)。这样做下去根节点 \(1\) 的子树内最大的数小于 \(n\times 2\),满足题意。

如果 \(siz_u=1\),即 \(u\) 没有儿子,显然满足条件。


我们填 \(val_{v_0}=val_{u}+1\),下一个子树还能填的数是 \(x=val_{v_0}+siz_{v_0}\times 2-1=val_{u}+siz_{v_0}\times 2\)

  1. 如果 \(siz_{v_0}\neq 1\)。

    显然 \(x-val_u=siz_{v_0}\times 2\) 是一个合数,我们直接填 \(val_{v_1}=x\)。则填完后还能从 \(x'=val_{v_1}+siz_{v_1}\times 2-1 =val_u+(siz_{v_0}+siz_{v_1})\times 2-1\) 填下一个子树,我们填 \(val_{v_2}=x'+1\) 即可满足合数条件。执行这样的操作,我们可以保证填完所有子树后,还能填的数是 \(val_u+\sum siz_v\times 2-1<val_u+siz_u\times 2-1\),成立。

  2. 如果 \(siz_{v_0}=1\)。

    • 如果 \(siz_u=2\),即 \(u\) 只有这一个子树,显然 \(val_u+1<val_u+siz_u\times 2-1\)。

    • 否则填 \(val_{v_1}=val_u+4\),那么接下来能填的数 \(x'=val_u+4+siz_{v_1}\times 2-1=val_u+(siz_{v_0}+siz_{v_1})\times 2+1\),于是我们填 \(val_{v_2}=x’+1\) 即可满足合数条件。执行这样的操作,我们可以保证填完所有子树后,还能填的数是 \(val_{u}+\sum siz_v \times 2+1=val_u+siz_u\times 2-1\),成立。

于是就得证了。


所以只要一个 \(val_v=val_u+1\),剩下的 \(u\) 的儿子填一个找一个最小的 \(k>1\),填 \(val_u+2k\) 大于目前已填的数即可。

我写代码的时候是用长链填连续的数写的。随便看看就好了,主要还是证明要严格比较费脑子。

const int N=200005;
int Test;
int n,son[N],mxd[N],dep[N],tot=0,ans[N];

vector<int>tar[N];

void dfs(int u,int f){
	mxd[u]=dep[u]=dep[f]+1;
	for(auto v:tar[u]){
		if(v==f)continue;
		dfs(v,u);
		if(mxd[v]>mxd[son[u]])son[u]=v;
		mxd[u]=max(mxd[u],mxd[v]);
	}
}

void calc(int u,int f){
	ans[u]=++tot;
	if(son[u])calc(son[u],u);
	for(auto v:tar[u]){
		if(v==f||v==son[u])continue;
		if(tot+1-ans[u]==2)tot=ans[u]+3;
		else if((tot+1-ans[u])%2==1)++tot;
		calc(v,u);
	}
}

int main(){
	scanf("%d",&Test);
	while(Test--){
		scanf("%d",&n);tot=0;
		for(int i=1;i<=n;++i){
			tar[i].clear();
			son[i]=mxd[i]=dep[i]=ans[i]=0;
		}
		for(int i=1;i<n;++i){
			int u,v;scanf("%d%d",&u,&v);
			tar[u].push_back(v);
			tar[v].push_back(u);
		}
		dfs(1,0);
		calc(1,0);
		for(int i=1;i<=n;++i)
			printf("%d ",ans[i]);
		puts("");
	}
	return 0;
}

好像数学公式后面会出现很多空的部分,不知道怎么回事。

标签:Prime,val,int,题解,tot,times,siz,CF2040D,mxd
From: https://www.cnblogs.com/BigSmall-En/p/18596196

相关文章

  • SpringBoot开发过程中经常遇到问题解决方案分享
    目录1. SpringBoot应用启动缓慢2. 数据库连接池配置问题3. SpringBoot应用无法连接外部服务4. 配置文件读取不生效5. SpringBoot应用的日志输出不完整6. SpringBoot中的@Transactional事务管理问题1. SpringBoot应用启动缓慢问题原因:SpringBoot应用启......
  • 深入理解PrimeFaces DataTable的懒加载分页机制
    在现代Web应用开发中,处理大量数据时,性能和用户体验是至关重要的。PrimeFacesDataTable组件提供了一种懒加载(lazyloading)机制,允许我们分批次加载和显示大量数据,而不是一次性加载所有数据。本文将通过一个具体的实例,详细解释如何利用PrimeFaces、JPA、Hibernate和H2内存数据......
  • XCVM1302-3HSEVFVB1369通过业界领先的 DDR 内存接口实现高数据吞吐量 - AMD Versal Pr
    XCVM1302-2MLIVSVF1369XCVM1302-2MSEVSVF1369XCVM1302-2MSIVFVB1369XCVM1302-2MSIVSVF1369XCVM1302-3HSEVFVB1369明佳达Versal自适应SoC兼具可编程逻辑和加速引擎的灵活处理能力,以及先进的内存和接口技术,可为各类应用实现定制化、强大的异构加速。VersalPrime系列是基......
  • [ARC189B] Minimize Sum 题解
    场上被创死了。思路考虑一次操作会造成什么影响。加入操作的是:\[x_1,x_2,x_3,x_4\]它们会变成:\[x_1,x_1+x_4-x_3,x_1+x_4-x_2,x_4\]发现没有什么规律。考虑它们的差分序列:\[x_1,x_4-x_3,x_3-x_2,x_2-x_1\]改变为交换\(2,4\)的差分。那么修改就变成很简单的形式了。......
  • 题解:P11266 【模板】完全体·堆
    题目链接洛谷P11266【模板】完全体·堆解题思路看了题解区,竟然没有人写可爱的左偏树。我们需要支持四种操作:删除集合中的元素。取集合中的最小值。合并两个集合。修改集合中的元素。那么我们可以用常数极小的左偏树(可并堆)来解决这道模板题。对于左偏树的基础操作......
  • HECTF网络安全挑战赛个人题解,主Reverse部分
    ReverseezAndroid比较难的一个题。java层用rc4解出一张图片知道flag的格式so层注册了d0func和stringFromJNI两个函数其中d0func给两个全局变量赋了值,还有两个小函数也对这两个变量进行了操作,交叉引用全部找出来即可解密得到1vxyzmissonD1key和go1denG08aTJYcxk在stringFro......
  • 基于验证链(Chain of Verification)的大语言模型幻觉问题解决方案
    LLM(SEALONG:LLM(LargeLanguageModel)在长上下文推理任务中的自我改进)在生成内容时往往会遭遇一个棘手的问题——幻觉(Hallucination)。模型自信地输出虚假或误导性信息,对依赖其准确输出的开发者、工程师及用户构成了实质性的挑战。为解决这一问题,研究者提出了ChainofVerificat......
  • 牛客周赛 Round 71 题解
    牛客周赛Round71题解A构造A+B容易想出最多有\(n-1\)种构造方法,所以只要判断\(n\)和\(k\)的关系即可。#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn,k;cin>>n>>k;if(k<=n-1){cout<<"YES\n";......
  • [题解](更新中)AtCoder Beginner Contest 383(ABC383) A~E
    A-Humidifier1照题意模拟即可,时间复杂度\(O(n)\)。点击查看代码#include<bits/stdc++.h>#defineintlonglong#defineN110usingnamespacestd;intn,t[N],v[N],sum;signedmain(){ cin>>n; for(inti=1;i<=n;i++)cin>>t[i]>>v[i]; for(inti=1......
  • CF1540B Tree Array 题解
    CF1540BTreeArray题解首先题目的时间复杂度一定是一个\(O(n^3)\)状物。一定会有一个\(n\)来枚举根节点,那么一个根内要\(O(n^2)\)地解决问题。考虑整个序列的期望是困难的,转而考虑每个点对\((x,y)\)的期望。注意到\((x,y)\)具有父子关系时,它的贡献是确定为\(0/1\)......