CF708C Centroids

题意翻译

给定一颗树,你有一次将树改造的机会,改造的意思是删去一条边,再加入一条边,保证改造后还是一棵树。

请问有多少点可以通过改造,成为这颗树的中心?(如果以某个点为根,每个子树的大小都小于n/2​,则称某个点为中心)

sol:先找到整颗树的重心,然后对于每个点,肯定是把重心的最大子树串过来最优(XJByy一下),如果这个点在最大子树中,就搞来次大子树,或者把除了最大子树的剩下一大坨串过来

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=,M=;
int n,rt,t1=,t2=,sz[N],mx[N];
int tot=,Next[M],to[M],head[N];
bool bo[N];
inline void Link(int x,int y)
{
Next[++tot]=head[x]; to[tot]=y; head[x]=tot;
}
inline void getrt(int x,int fat)
{
int e; sz[x]=; mx[x]=;
for(e=head[x];e;e=Next[e]) if(to[e]!=fat)
{
getrt(to[e],x); sz[x]+=sz[to[e]]; mx[x]=max(mx[x],sz[to[e]]);
}
mx[x]=max(mx[x],n-sz[x]); if(mx[x]<mx[rt]) rt=x;
}
inline void dfs(int x,int fat)
{
int e; sz[x]=;
for(e=head[x];e;e=Next[e]) if(to[e]!=fat)
{
dfs(to[e],x); sz[x]+=sz[to[e]];
}
}
inline void draw(int x,int fat)
{
int e; bo[x]=;
for(e=head[x];e;e=Next[e]) if(to[e]!=fat)
{
draw(to[e],x);
}
}
int main()
{
freopen("data.in","r",stdin);
int i,x,y;
R(n);
for(i=;i<n;i++)
{
R(x); R(y); Link(x,y); Link(y,x);
}
mx[rt=]=n+; sz[]=; getrt(,); dfs(rt,);
for(i=head[rt];i;i=Next[i])
{
if(sz[to[i]]>sz[t1]) t2=t1,t1=to[i];
else if(sz[to[i]]>sz[t2]) t2=to[i];
}
if(t1) draw(t1,rt);
// cout<<"rt="<<rt<<endl;
// for(i=1;i<=n;i++) cout<<bo[i]<<' '; puts("");
for(x=;x<=n;x++)
{
if(!bo[x])
{
if((n-sz[x]-sz[t1])*<=n) putchar('');
else putchar('');
}
else
{
if((n-sz[x]-sz[t2])*<=n) putchar('');
else if((n-sz[t1])*<=n) putchar('');
else putchar('');
}
putchar(' ');
}
return ;
}

codeforces708C的更多相关文章

  1. Codeforces708C Centroids 【树形dp】

    题目链接 题意:给定一棵n个结点的树,问:对于每个结点,能否通过删除一条边并添加一条边使得仍是树,并且删除该结点后得到的各个连通分量结点数 <= n/2? 题解:树形dp,两遍dfs,第一遍df ...

  2. Codeforces-708C(树形DP)

    一.题意 给定一颗树,对于每一个节点,判断能否在树中删除某一条边,然后在任意两个节点之间加一条边,使这个点成为重心. 注:删除树中某一条边后,标程并不会这么无聊地把这棵树变成两个孤立的连通图,而是再让 ...

随机推荐

  1. 把.exe的格式的运行程序加到电脑本地服务的办法(本文来源于百度)

    Instsrv.exe(可以给系统安装和删除服务) Srvany.exe(可以让程序以服务的方式运行) 方法/步骤     要实现这个功能要用到微软提供的两个小工具“instsrv.exe”和“srv ...

  2. sqlce基本语法

    整理和总结一下SQLCE的用法引用  System.Data.SqlServerCe(1)数据库文件的创建     SqlCeEngine eng = new SqlCeEngine("Da ...

  3. JS中逗号运算符的用法

    逗号运算符,它将先计算左边的参数,再计算右边的参数值.然后返回最右边参数的值. 原书举的例子不太好,无法解释上面那句话,这里另外提供一个: var a = 10, b = 20; function C ...

  4. css3之媒体查询

    <html> <head> <meta charset="utf-8"> <style> body{ background-colo ...

  5. CSS设置元素的隐藏和显示

    常见的三种方式 display display: none 隐藏对象 display: block 除了转换为块级元素以外,同时还有显示元素的意思 特点:隐藏之后不保留位置 visibility 值h ...

  6. vue+element-ui upload图片上传前大小超过4m,自动压缩到指定大小,长宽

    最近项目需要实现一个需求,用户上传图片时,图片大小超过4M,长宽超过2000,需要压缩到400k,2000宽高.在git上找到一个不错的方法,把实现方法总结一下: 安装image-conversion ...

  7. debian设置limits.conf

    最近已经把自己的游戏框架主要功能完成得差不多了,决定将自己的开发环境从debian7升级到debian9,不然太多第三方依赖都跟不上了.debian10刚出来,MongoDB还没适配,所以暂不考虑. ...

  8. C# 一个数组集合,任意组合,不遗漏,不重复

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  9. golang map多层嵌套使用及遍历方法汇总

    原文:https://blog.csdn.net/boyhandsome7/article/details/79734847 ------------------------------------- ...

  10. 17-SQLServer使用证书认证的方式搭建数据库镜像

    一.注意点 1.数据库的模式要是完整模式. 2.要对数据库完整备份和事务日志备份,分别还原到镜像库上,使用NORECOVERY模式. 3.镜像数据库是不允许删除和操作,即便查看属性也不行. 4.先删除 ...