[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相

description

solution

一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿子最轻,每个儿子siz≤n2\le\frac{n}{2}≤2n​)

显然原树的重心答案为0

对于点iii,若要成为新的重心

贪心地有,从原重心的最大儿子边开始断,然后直接接在iii上

此时把iii提起来当根,则有原来的子树仍不变,断掉的若干个子树接在下面,剩下的所有点为一个子树

如果原重心断的子树节点达到/超过n2\frac{n}{2}2n​,则一定是可以使任意一个iii成为新重心的(剩下节点数不到一半,符合重心设定)

最后的答案一定是cnt/cnt−1,cntcnt/cnt-1,cntcnt/cnt−1,cnt表示重心断的子树个数

1的出入是因为有些点可能自己的sizsizsiz足够大,不需要断这么多

如图:红边,黄边为被断子树(黄边为最后一个被断子树)

  • iii属于被断子树内(第一个红点)

    先不断这个子树,断另外的cnt-1个子树,此时需要判断总点数n−n-n−其子树siz[i]−siz[i]-siz[i]−断掉的子树used=used=used=剩下的子树是否>n2>\frac{n}{2}>2n​,超过再断iii所在rootrootroot的子树

  • iii属于残留子树(第二个红点)

    先不断第cnt被断子树(这样剩下连在一起的子树节点才最小,才更有可能少断一条边),同样的判断

code

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 1000005
vector < int > G[maxn];
int n, rt, minn, cnt;
int siz[maxn], ans[maxn];void dfs( int u, int fa ) {siz[u] = 1;int max_size = 0;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;else dfs( v, u );siz[u] += siz[v];max_size = max( max_size, siz[v] );}max_size = max( max_size, n - siz[u] );if( max_size < minn ) {minn = max_size;rt = u;}
} int GetRoot() {minn = 0x7f7f7f7f;dfs( 1, 0 );return rt;
}bool cmp( const int x, const int y ) {return siz[x] > siz[y];
}void solve( int u, int fa, int used ) {ans[u] = cnt + ( ( ( n - siz[u] - used ) << 1 ) > n );for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;else solve( v, u, used );}
}int main() {scanf( "%d", &n );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%d %d", &u, &v );G[u].push_back( v );G[v].push_back( u );}int root = GetRoot();dfs( root, 0 );sort( G[root].begin(), G[root].end(), cmp );int tot = 0;for( int i = 0;i < G[root].size();i ++ ) {tot += siz[G[root][i]];if( ( tot << 1 ) >= n ) break;cnt ++;}for( int i = 0;i < G[root].size();i ++ )solve( G[root][i], root, tot - max( siz[G[root][i]], siz[G[root][cnt]] ) );for( int i = 1;i <= n;i ++ )printf( "%d\n", ans[i] );return 0;
}

[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)相关推荐

  1. 【思维题 细节】loj#6042. 「雅礼集训 2017 Day7」跳蚤王国的宰相

    挂于±1的细节-- 题目描述 跳蚤王国爆发了一场动乱,国王在镇压动乱的同时,需要在跳蚤国地方钦定一个人来做宰相. 由于当时形势的复杂性,很多跳蚤都并不想去做一个傀儡宰相,带着宰相的帽子,最后还冒着被打 ...

  2. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 -- 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  3. Loj 6036 「雅礼集训 2017 Day4」编码 - 2-sat

    题目传送门 唯一的传送门 题目大意 给定$n$个串,每个串只包含 '0','1','?' ,其中 '?' 至多在每个串中出现1次,它可以被替换为 '0' 或 '1' .问是否可能任意两个不同的串不满足 ...

  4. LOJ#6044. 「雅礼集训 2017 Day8」共(Prufer序列)

    题面 传送门 题解 答案就是\(S(n-k,k)\times {n-1\choose k-1}\) 其中\(S(n,m)\)表示左边\(n\)个点,右边\(m\)个点的完全二分图的生成树个数,它的值为 ...

  5. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

  6. LOJ #6052. 「雅礼集训 2017 Day11」DIV

    完了我是数学姿势越来越弱了,感觉这种CXRdalao秒掉的题我都要做好久 一些前置推导 首先我们很容易得出\((a+bi)(c+di)=k \Leftrightarrow ac-bd=k,ad+bc= ...

  7. 「雅礼集训 2017 Day7」事情的相似度(后缀自动机+LCT+树状数组)

    description 点击查看题目内容 solution Step1 无脑建SAMSAMSAM 两个前缀的最长公共后缀就是parent−treeparent-treeparent−tree上两点的l ...

  8. LOJ #6051. 「雅礼集训 2017 Day11」PATH

    完了感觉最近留了好多坑的说,这题也是模模糊糊地会一点 首先我们发现题目要求的是单调不上升的序列个数,那么一个套路就是用值减去下标 然后考虑连续位置的限制,这个我们做一个置换然后尽量向后取 这样拿值和位 ...

  9. loj 6038「雅礼集训 2017 Day5」远行

    http://www.elijahqi.win/archives/3236 题目描述 Miranda 生活的城市有 N NN 个小镇,一开始小镇间没有任何道路连接.随着经济发现,小镇之间陆续建起了一些 ...

最新文章

  1. mysql在电脑哪里启动项_所有电脑和主板开机选择启动项的快捷键
  2. php session 过期,php session失效的原因
  3. 如何居中一个元素(终结版)
  4. UART, SPI, IIC的详解及三者的区别和联系
  5. android 判断是否正在扫描蓝牙_判断蓝牙是否连接
  6. Angular:why click add button does not work for the second time
  7. 苹果明年或将推出升级版iPhone 8 人人都用得起?
  8. 账号管理工具_新媒体账号管理工具,自媒体运营神器,管理多个账号很简单
  9. iPhone11用第三方的快充,电池健康度会下降很快吗?
  10. PHP经验——获得PHP版本信息及版本比较
  11. 数据库课程设计(学校运动会管理系统)2021-9-21
  12. 几种常见的4K高清视频信号传输方案对比
  13. Android 关于数学的显示
  14. 什么叫单模光纤_什么叫单模光纤_单模光纤的特点是什么 - 全文
  15. jQuery+PHP实现的砸金蛋中奖程序
  16. i5 vs i7区别是什么,那个处理器适合您的电脑?
  17. 存储--盘古,阿里云飞天分布式存储系统设计深度解析
  18. C#实现简单进销存管理系统EMS
  19. 有N步台阶,每次可以走1步或者2步,计算有多少种走法
  20. [SpringBoot] [使用]经典三层架构及“DO/BO/VO/DTO“对象总结

热门文章

  1. 用Python画中国地图(二)
  2. 你连简单的枚举类都不知道,还敢说自己会Java???滚出我的公司
  3. java web 测试类,构建一个容易单元测试的java–web系统-JSP教程,Java技巧及代码
  4. 32位mysql安装包_MySQL安装指南(CPT103)
  5. 获取两个数据的交集_MySQL交集和差集的实现方法
  6. python while循环true_Python while循环,pause while not,true时继续?
  7. deb包如何改支持12系统_对一个deb包的解压、修改、重新打包全过程方法
  8. [Java基础]Junit测试
  9. [Java基础]体验Stream流
  10. [汇编语言]常用命令