Codeforces.911F.Tree Destruction(构造 贪心)
\(Description\)
一棵n个点的树,每次可以选择树上两个叶子节点并删去一个,得到的价值为两点间的距离
删n-1次,问如何能使最后得到的价值最大,并输出方案
\(Solution\)
树上距离,求最大,可以考虑下树的直径
假如已知树的直径u->v,那么任意一点x到达其他点的最远距离就是u,v中一点(如果不是这样,那直径一定可以更长而不是uv)
假设x距u最远,那肯定是删x
删直径上的点(直径端点)会导致一些点取不到最远距离
既然这样按顺序删非直径上的点,最后删直径端点
#include<cstdio>
#include<cctype>
#include<algorithm>
#define gc() getchar()
const int N=2e5+5;
int n,U,V,mxdis,fa[N],dis[N][2],cnt,D[N],Enum,H[N],to[N<<1],nxt[N<<1];
long long res;
bool Is_d[N];
struct Triple
{
int u,v,w;
}ans[N];
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline void AddEdge(int u,int v)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
void DFS(int x,int f,int ds)
{
fa[x]=f;
for(int i=H[x];i;i=nxt[i])
if(to[i]!=f) DFS(to[i],x,ds+1);
if(ds>mxdis) mxdis=ds, V=x;
}
void DFS2(int x,int f,bool op)
{
for(int i=H[x];i;i=nxt[i])
if(to[i]!=f)
dis[to[i]][op]=dis[x][op]+1, DFS2(to[i],x,op);
}
void DFS3(int x,int f)
{
for(int i=H[x];i;i=nxt[i])
if(to[i]!=f) DFS3(to[i],x);
if(!Is_d[x])
if(dis[x][0]>dis[x][1]) res+=dis[x][0],ans[++cnt]=(Triple){U,x,x};
else res+=dis[x][1],ans[++cnt]=(Triple){V,x,x};
}
int main()
{
n=read();
for(int u,v,i=1;i<n;++i) u=read(),v=read(),AddEdge(u,v);
DFS(1,-1,0);
U=V, mxdis=0;
DFS(U,-1,0);
int x=V,tot=0;
res=1ll*mxdis*(mxdis+1)>>1;
while(x!=U) Is_d[x]=1,D[++tot]=x,x=fa[x];
Is_d[U]=1;
DFS2(U,-1,0), DFS2(V,-1,1);
DFS3(U,-1);
printf("%I64d\n",res);
for(int i=1;i<=cnt;++i) printf("%d %d %d\n",ans[i].u,ans[i].v,ans[i].w);
for(int i=1;i<=tot;++i) printf("%d %d %d\n",U,D[i],D[i]);
return 0;
}
Codeforces.911F.Tree Destruction(构造 贪心)的更多相关文章
- Codeforces 911F Tree Destruction(贪心 && 树的直径)
题目链接 Tree Destructi 题意 给定一棵树,每次可以选定树上的两个叶子,并删去其中的一个.答案每次加上两个选定的叶子之间的距离. 求最后答案的最大值. 首先求出树的某一条直径,令其端 ...
- Codeforces 911F Tree Destruction
Tree Destruction 先把直径扣出来, 然后每个点都和直径的其中一端组合, 这样可以保证是最优的. #include<bits/stdc++.h> #define LL lon ...
- [Codeforces 911F] Tree Destruction 解题报告(贪心)
题目链接: http://codeforces.com/contest/911/problem/F 题目大意: 给你一棵树,每次挑选这棵树的两个度数为1的点,加上他们之间的边数(距离),然后将其中一个 ...
- codeforces 356 C. Compartments 构造 贪心
一辆车,有n个车厢,每个车厢刚好有4个人 车上有n个学生,第i个车厢有a[i]个学生 如果一个车厢里面的学生数 <= 2,这个车厢里的学生会不开心 如果一个车厢里面的学生数 > 2,这个车 ...
- CodeForces - 1255D (模拟+构造+贪心)
题意 https://vjudge.net/problem/CodeForces-1255D rxc的农场里'R'表示有米,现在有K只鸡,给这k只鸡选一些格子,每个鸡可以有多个格子(每个鸡至少吃一个米 ...
- CF911F Tree Destruction 解题报告
CF911F Tree Destruction 题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 输入输出格式 输 ...
- codeforces Gym 100338E Numbers (贪心,实现)
题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...
- [Codeforces 1214A]Optimal Currency Exchange(贪心)
[Codeforces 1214A]Optimal Currency Exchange(贪心) 题面 题面较长,略 分析 这个A题稍微有点思维难度,比赛的时候被孙了一下 贪心的思路是,我们换面值越小的 ...
- 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...
随机推荐
- 【逆向工具】IDA使用5-( string、图形化与视图的切换、图形化显示反汇编地址、自动注释、标签使用)
分析petya病毒时新学会的技巧. IDA技巧1 : string 提取文件中的字符串内容,如果看到一些文件字符串可以定位到关键的函数中. view -> open subview -> ...
- Getting started with machine learning in Python
Getting started with machine learning in Python Machine learning is a field that uses algorithms to ...
- 数据库的连接使用——使用ADO.NET连接数据库
一.ADO.NET简介 ADO.NET是由很多类组成的一个类库,这些类库提供了很多对象,用来完成数据的连接.查询.插入.更新和删除等操作.其中主要包括以下对象: 1.Connection对象:用来连接 ...
- hping网络安全工具的安装及使用
hping是用于生成和解析TCPIP协议数据包的开源工具.创作者是Salvatore Sanfilippo.目前最新版是hping3,支持使用tcl脚本自动化地调用其API.hping是安全审计.防火 ...
- Android网络通信(7):NFC
Android网络通信之 NFC NFC:近场通信,是一种超近距离的无线通信技术.Android从2.3版本的SDK开始支持基于NFC通信.基于NFC的识别和通信可分为三个步骤:1.Android通过 ...
- pandas使用lambda判断元素是否为空或者None
df2a_tp2 = df2a[df2a['combineIdentifyCode'].map(lambda x: len(str(x).strip())>0)].copy() #识别出合单的订 ...
- spring mvc 校验@NULL
一需要的包 1 validation-api-1.0.0.GA.jar:JDK的接口: 2 hibernate-validator-4.2.0.Final.jar 是对上述接口的实现: 二 若在pom ...
- Python 正则表达式模块 (re) 简介
Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使用这一内嵌于 Python 的语言工具,尽管不能 ...
- sql基础笔记备忘
MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型:tinyint smallint medium ...
- LeetCode(55): 跳跃游戏
Medium! 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1, ...