CF2018C Tree Pruning 题解

news/2024/10/11 1:42:35/

Description

给定一棵有 n n n 个点的以 1 1 1 为根的树,在此问题中,叶子节点被定义为非根的度数为一的点。

每次操作可以删去一个叶子节点及其相连的边,你需要求出最小的操作次数,使得操作后所有叶子节点到根节点的距离相同。

Solution

考虑一条边什么情况下不会被删去。

对于 ( x , y ) (x,y) (x,y) 这条边,设 y y y 为深度较大的那个点, z z z y y y 子树内深度最大的点,那么只要操作完后的叶子深度在 [ d e p y , d e p z ] [dep_y,dep_z] [depy,depz] 范围内,那么这条边就不会被删去,对区间 [ d e p y , d e p z ] [dep_y,dep_z] [depy,depz] 1 1 1 即可,最后叶子深度则为所有可能深度中被加次数最大的那个深度,答案为边数减去其被加的次数。

发现这是区间加,单点查询,你可以用你喜欢的数据结构维护,如线段树、树状数组、分块等。

代码用线段树实现,复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls x<<1
#define rs x<<1|1
int t;
int n,tot;
int head[1000010],dep[1000010];
struct edge{int to,next;
}e[1000010];
void add(int x,int y){e[++tot]=edge{y,head[x]};head[x]=tot;
}
struct tree{int sum;
}tr[2000020];
void build(int x,int l,int r){tr[x].sum=0;if(l==r) return ;int mid=l+r>>1;build(ls,l,mid);build(rs,mid+1,r);
}
void update(int x,int l,int r,int L,int R){if(l>=L&&r<=R){tr[x].sum++;return ;}int mid=l+r>>1;if(L<=mid) update(ls,l,mid,L,R);if(R>=mid+1) update(rs,mid+1,r,L,R);
}
int query(int x,int l,int r,int k){if(l==r) return tr[x].sum;int mid=l+r>>1,ans=tr[x].sum;if(k<=mid) return ans+query(ls,l,mid,k);else return ans+query(rs,mid+1,r,k);
}
int dfs(int x,int fax){dep[x]=dep[fax]+1;int maxn=dep[x];for(int i=head[x];i;i=e[i].next){int y=e[i].to;if(y==fax) continue;int z=dfs(y,x);update(1,1,n,dep[x]+1,z);maxn=max(maxn,z);}return maxn;
}
void init(){tot=0;for(int i=1;i<=n;i++){head[i]=0;}build(1,1,n);
}
void solve(){cin>>n;init();for(int i=1;i<n;i++){int x,y;cin>>x>>y;add(x,y),add(y,x);}dfs(1,0);int ans=0;for(int i=1;i<=n;i++){ans=max(ans,query(1,1,n,i));}cout<<n-1-ans<<'\n';
}
int main(){ios::sync_with_stdio(0);cin.tie(nullptr);cin>>t;while(t--){solve();}return 0;
}

http://www.ppmy.cn/news/1537214.html

相关文章

【数字图像处理】第一章 数字图像处理概论,图像的分类。主要内容

上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 1.1 图像处理的产生 1.2 图像的基本概念 图像的分类 图像的表示方法 1.3 数字图像处理系统 1.4 数字图像处理的应用与发展 一. 数字图像处理及其特点 2. 数字图像处理 二. 图像处理的主要内容 2. 数字图像处理…

红帽7—Mysql路由部署

MySQL Router 是一个对应用程序透明的InnoDB Cluster连接路由服务&#xff0c;提供负载均衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性&#xff0c;用户可以编写应用程序来连接到路由器&#xff0c;并令路由器使用相应的路由策略 来处理连接&#xff0c;使其…

明星周边销售网站开发:SpringBoot技术全解析

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

面试知识储备-多线程

1.线程的概念 线程使得在一个程序中可以同时执行多个任务。在 Java 应用程序中&#xff0c;多个线程可以同时运行&#xff0c;例如一个线程可以处理用户输入&#xff0c;另一个线程可以进行后台数据处理。 2.创建线程的方式 &#xff08;1&#xff09;重写thread类中的run方法…

噪声分布 双峰,模拟函数 或者模拟方法 python人工智能 深度神经网络

在Python中模拟双峰分布&#xff0c;可以通过多种方法实现。以下是一些常用的方法&#xff1a; 1. **使用正态分布混合**&#xff1a; 可以通过组合两个正态分布来创建一个双峰分布。每个正态分布都有其自己的均值&#xff08;mu&#xff09;和标准差&#xff08;sigma&…

EcoVadis认证内容有哪些?EcoVadis认证申请流程?

EcoVadis认证是一个国际性的可持续发展评估平台&#xff0c;旨在帮助全球企业和供应链评鉴其在环境、社会和治理&#xff08;ESG&#xff09;方面的表现。该认证框架由法国的检验、认证和检测机构必维集团&#xff08;Bureau Veritas&#xff09;创建&#xff0c;得到了众多跨国…

一般在写SQL时需要注意哪些问题,可以提高查询的效率?

很多人写SQL按照自己喜好&#xff0c;没有规则意识&#xff0c;这对于自主查询影响不大&#xff0c;你爱怎么搞就怎么搞&#xff0c;一旦涉及到提交任务或团队共享&#xff0c;就不能乱写了&#xff0c;会浪费资源影响到开发效率&#xff0c;严重的甚至会服务器瘫痪。 提几个关…

【openwrt-21.02】T750 openwrt 出现nat46_ipv4_iput crash

Openwrt版本 NAME="OpenWrt" VERSION="21.02-SNAPSHOT" ID="openwrt" ID_LIKE="lede openwrt" PRETTY_NAME="OpenWrt 21.02-SNAPSHOT" VERSION_ID="21.02-snapshot" HOME_URL="https://openwrt.org/" …