题目大意

给出一棵 \(n\) 个节点的树,删去其中两条边

使得分出的三个子树大小中最大与最小的差最小

分析

先一边 \(dfs\) 预处理出以 \(1\) 为根每个点的 \(size\)

然后按 \(dfs\) 的顺序枚举一个点,表示删去这个点返回父亲的边

记这个点为 \(x\)

分类讨论

第一种情况是删去当前点到根的一条边,记这条边下面的点为 \(y\)

这种情况会使子树 \(y\) 包含子树 \(x\)

第二种情况是删去不包含子树 \(x\) 的已经遍历过的边

这种情况须令外处理

于是我们算答案是要做两遍 \(dfs\)

具体细节看代码

\(Code\)

#include<cstdio>
#include<iostream>
#include<set>
using namespace std; const int N = 2e5 + 5;
int n, h[N], siz[N], ans;
set<int> s;
set<int>::iterator it;
struct edge{int to, nxt;}e[N << 1]; void add(int x, int y)
{
static int tot = 0;
e[++tot] = edge{y, h[x]}, h[x] = tot;
} void dfs(int x, int fa)
{
siz[x] = 1;
for(register int i = h[x], v; i; i = e[i].nxt)
{
v = e[i].to;
if (v == fa) continue;
dfs(v, x), siz[x] += siz[v];
}
} int getc(int x, int y, int z)
{
int a = max(max(x, y), z), b = min(min(x, y), z);
return a - b;
} void calc(int x)
{
int d = (n - siz[x]) >> 1;
it = s.lower_bound(d);
if (it != s.end()) ans = min(ans, getc(siz[x], *it, n - siz[x] - *it));
if (it != s.begin()) --it, ans = min(ans, getc(siz[x], *it, n - siz[x] - *it));
} void dfs1(int x, int fa)
{
calc(x);
s.insert(n - siz[x]);
for(register int i = h[x], v; i; i = e[i].nxt)
{
v = e[i].to;
if (v == fa) continue;
dfs1(v, x);
}
s.erase(n - siz[x]);
} void dfs2(int x, int fa)
{
for(register int i = h[x], v; i; i = e[i].nxt)
{
v = e[i].to;
if (v == fa) continue;
calc(v), dfs2(v, x);
}
s.insert(siz[x]);
} int main()
{
freopen("chilli.in", "r", stdin);
freopen("chilli.out", "w", stdout);
scanf("%d", &n);
for(register int i = 1, x, y; i < n; i++) scanf("%d%d", &x, &y), add(x, y), add(y, x);
ans = 0x3f3f3f3f, dfs(1, 0), dfs1(1, 0), s.clear(), dfs2(1, 0);
printf("%d", ans);
}

JZOJ 【2020.11.30提高组模拟】剪辣椒(chilli)的更多相关文章

  1. 【2020.11.30提高组模拟】剪辣椒(chilli)

    剪辣椒(chilli) 题目描述 在花园里劳累了一上午之后,你决定用自己种的干辣椒奖励自己. 你有n个辣椒,这些辣椒用n-1条绳子连接在一起,任意两个辣椒通过用若干个绳子相连,即形成一棵树. 你决定分 ...

  2. 【2020.11.30提高组模拟】删边(delete)

    删边(delete) 题目 题目描述 给你一棵n个结点的树,每个结点有一个权值,删除一条边的费用为该边连接的两个子树中结点权值最大值之和.现要删除树中的所有边,删除边的顺序可以任意设定,请计算出所有方 ...

  3. 【2020.11.28提高组模拟】T1染色(color)

    [2020.11.28提高组模拟]T1染色(color) 题目 题目描述 给定 \(n\),你现在需要给整数 \(1\) 到 \(n\) 进行染色,使得对于所有的 \(1\leq i<j\leq ...

  4. 【2020.11.28提高组模拟】T2 序列(array)

    序列(array) 题目描述 ​给定一个长为 \(m\) 的序列 \(a\). 有一个长为 \(m\) 的序列 \(b\),需满足 \(0\leq b_i \leq n\),\(\sum_{i=1}^ ...

  5. JZOJ 5185. 【NOIP2017提高组模拟6.30】tty's sequence

    5185. [NOIP2017提高组模拟6.30]tty's sequence (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB ...

  6. JZOJ 5184. 【NOIP2017提高组模拟6.29】Gift

    5184. [NOIP2017提高组模拟6.29]Gift (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed ...

  7. JZOJ 5197. 【NOIP2017提高组模拟7.3】C

    5197. [NOIP2017提高组模拟7.3]C Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  8. JZOJ 5196. 【NOIP2017提高组模拟7.3】B

    5196. [NOIP2017提高组模拟7.3]B Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  9. JZOJ 5195. 【NOIP2017提高组模拟7.3】A

    5195. [NOIP2017提高组模拟7.3]A Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  10. 【2020.12.03提高组模拟】A组反思

    估计:40+10+0+0=50 实际:40+10+0+0=50 rank40 T1 赛时看到\(n,m\leq9\),我当机立断决定打表,暴力打了几个点之后发现在\(n\ne m\)且\(k\ne0\ ...

随机推荐

  1. MySQL进阶实战5,为什么查询速度会慢

    一.先了解一下MySQL查询的执行过程 MySQL在查询时,它是由很多子任务组成的,每个子任务都会消耗一定的时间,如果要想优化查询,实际上要优化其子任务,可以消除一些子任务.减少子任务的执行次数.让子 ...

  2. Linux 中的文件简单说明

    Linux 中的文件简单说明 作者:Grey 原文地址: 博客园:Linux 中的文件简单说明 CSDN:Linux 中的文件简单说明 说明 本文基于 CentOS 7 根目录(/)下文件夹主要作用 ...

  3. log4j漏洞原理

    一.前置知识 1.JNDI接口 JNDI即Java Naming and Directory Interface(JAVA命名和目录接口),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发 ...

  4. [.NET学习]EFCore学习之旅 -2 简单的增删改查

    1.实例化创建数据库上下文类 首先实例化一个数据库操作上下文类,注意到DbContext实现了IDisposable接口,所以使用using语句,避免内存泄露. 2.插入 以Person类为例,先生成 ...

  5. [论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL)

    [论文阅读] 颜色迁移-Linear Monge-Kantorovitch(MKL) 文章: The Linear Monge-Kantorovitch Linear Colour Mapping f ...

  6. 【每日一题】【list转int数组】【Lambda的简化-方法引用】2022年1月15日-NC45 实现二叉树先序,中序和后序遍历

    描述 给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点.   数据范围:0 \le n \le 10000≤n≤1000,树上每个节点的val值满足 0 \le val \le 1000≤ ...

  7. 【Impala】概念、原理、内外部shell、建库建表、分区、查询、自定义函数、存储压缩

    一.基本概念 1.介绍 对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能 2.优缺点 优点:基于内存运算,无需写入磁盘,无需转化为MR,支持Data Locality调度(数据和计算在 ...

  8. week_2

    Andrew Ng 机器学习笔记 ---by OrangeStar Week_2 1.Multiple Features 更有效的线性回归形式 此时,h函数已经不是二阶了. \[ X = \begin ...

  9. C++进阶(哈希)

    vector容器补充(下面会用到) 我们都知道vector容器不同于数组,能够进行动态扩容,其底层原理:所谓动态扩容,并不是在原空间之后接续新空间,因为无法保证原空间之后尚有可配置的空间.而是以原大小 ...

  10. [0x12] 132.小组队列

    题意 link(more:UVA540) 简化题意:对 \(n\) 个小组排队,每个小组有至多 \(m\) 个成员(每个成员有唯一编号 \(x\)),当一个人来到队伍时,如果队中有同组成员,直接插入其 ...