首页 > 其他分享 >【题解】CF1225F

【题解】CF1225F

时间:2023-03-20 15:58:02浏览次数:47  
标签:head ma int 题解 fro son tail CF1225F

题目描述

给出一棵 n 个节点的有根树 T ,点编号为 0 ∼ n − 1。记 f(u) 为 u 的父节点。
初始时你有一条 n 个点的链 L(标号任意),每次操作你可以令 f(u) ← f(f(u)) 。
需要将链改造为 T ,构造一种操作数目最少的方案。

题解

构造题关键:题目性质+手玩数据
手玩得知一个点要走的距离是它链上的前一个点和它在原树上的父亲在原树上的深度差。
同时又有一个结论:观察到实际除了最后一条走的链,其他的点都会被走到,于是构造最深链最后走,答案为n-max(dep)。
于是按照dfs序走即是链的顺序,长儿子最后走。

#include<bits/stdc++.h>
using namespace std;
inline int rd(){
	int f=1,j=0;
	char w=getchar();
	while(!isdigit(w)){
		if(w=='-')f=-1;
		w=getchar();
	}
	while(isdigit(w)){
		j=j*10+w-'0';
		w=getchar();
	}
	return f*j;
}
const int N=100010;
int head[N],to[N*2],fro[N*2],tail;
int n,dfn[N],fa[N],cnt,dep[N],ma[N],son[N];
inline void adlin(int x,int y){
	to[++tail]=y,fro[tail]=head[x],head[x]=tail;
	return ;
}
void dfs1(int u){
	dep[u]=ma[u]=dep[fa[u]]+1;
	for(int k=head[u];k;k=fro[k]){
		int x=to[k];
		fa[x]=u;
		dfs1(x);
		ma[u]=max(ma[x],ma[u]);
		if(ma[x]>ma[son[u]])son[u]=x;
	}
	return ;
}
void dfs2(int u){
	dfn[++cnt]=u;
	for(int k=head[u];k;k=fro[k]){
		int x=to[k];
		if(x!=son[u])dfs2(x);
	}
//	cout<<"walk:"<<u<<"\n";
	if(son[u])dfs2(son[u]);
	return ;
}
int ans;
signed main(){
	n=rd();
	for(int i=2;i<=n;i++){
		int x=rd()+1;
		adlin(x,i);
	}
	dfs1(1);
//	for(int i=1;i<=n;i++)cout<<son[i]<<" ";
//	cout<<"\n";
	dfs2(1);
	for(int i=1;i<=n;i++)printf("%d ",dfn[i]-1);
	printf("\n");
	for(int i=2;i<=n;i++)ans+=dep[dfn[i-1]]-dep[fa[dfn[i]]];
	printf("%d\n",ans);
	for(int i=2;i<=n;i++)for(int j=dep[dfn[i-1]]-dep[fa[dfn[i]]];j;j--)printf("%d ",dfn[i]-1);
	return 0;
}

标签:head,ma,int,题解,fro,son,tail,CF1225F
From: https://www.cnblogs.com/T-water/p/17236565.html

相关文章

  • 【题解】CF1439A2
    题目描述给定一个\(n\timesm\)的\(01\)矩阵,每次操作可以将某个\(2\times2\)的矩阵内的\(3\)个数取反,请在\(n\timesm\)步内将矩阵变为全\(0\)。题解这种题......
  • C# 上传接口返回错误: (413) Request Entity Too Large问题解决
    问题报错:Failedtoloadresource:theserverrespondedwithastatusof413(RequestEntityTooLarge)找了很多方法,说什么反向代理配置啥的其实很多项目并没有开反......
  • CF1804C 题解
    题目链接今天好不容易有空更那就再更一篇(一道很有意思的诈骗题,我会写出我的思考过程。题意:(我的翻译)一个转盘有$n$个格子分别为$0$$1$$2$$\cdots$$n-1$,初始时在......
  • 【题解】ABC294
    AtCoderBeginnerContest294AFilter无意义题,找出所有偶数。BASCIIArt无意义题,按题意模拟。CMergeSequences无意义题,离散化即可。DBank无意义题,set维护即......
  • ucyhf 题解
    题目传送门愚人节题目,具体题面看翻译。先写一个判断素数的函数,这题并不需要什么特殊的筛法,新手可以参考以下代码。boolisprime(intx){if(x<=1)return0;......
  • Party 题解
    题目传送门一道简单的并查集练手题。与普通的并查集不同,除此之外还需记录下来某两人的讨厌关系,使得他们不能在同一集合中。if(find_root(x)==find_root(y))vis[find......
  • CF1060E 题解
    前言题目传送门!更好的阅读体验?提供一种更加麻烦的换根DP写法。思路代码#include<iostream>#include<cstdio>usingnamespacestd;typedeflonglongll;cons......
  • 3 月 15 日测试题解
    3月15日测试题解这学校的评测机我是真的吐了,\(\text{380pts}\rightarrow\text{300pts}\),电脑速度跟BZOJ有的一拼。一句话总结:简单,过于简单,但是在练习读题能力上十......
  • 3 月 19 日测试题解
    3月19日测试题解原来这就是AK的滋味吗,不过,我却完全没感到开心呢。T1题意给出两个整数\(a\),\(b\),重复以下操作直到\(a=b\):设\(a>b\),否则交换\(a\)与\(......
  • P5445 [APIO2019] 路灯 题解
    题目链接题目描述给你一个01串,有\(q\)个时刻,每个时刻要么把一位取反,要么问你在过去的所有时刻中有多少个时刻\(a\)和\(b-1\)之间都为1。题目分析观察题目,我们......