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. mvc控制器返回操作结果封装

    实体类 public class AjaxResult { /// <summary> /// 获取 Ajax操作结果类型 /// </summary> public Resu ...

  2. fish redux 个人理解

    fish redux 理解 fish redux是什么 Fish Redux 是一个基于 Redux 数据管理的组装式 flutter 应用框架, 它特别适用于构建中大型的复杂应用. 它的特点是配置式 ...

  3. 一步一步搭建 .net core 应用

    前言 近段时间 .net core 大火,公司也打算趁此机会把后续项目迁移到 .net core 平台上,我们下面的一帮人也就跟着大部队,开始狂补 dotnetcore 相关的技术了.此贴主要记录我在 ...

  4. JAVA8新特性随笔

    Instant:瞬时实例 LocalDate:本地日期,不包含具体时间.例如:2014-01-14可以用来记录生日.纪念日.加盟日等. LocalTime:本地时间,不包含日期 LocalDateTi ...

  5. Stanford NLP 课程笔记之计算字符串距离

    在自然语言处理任务中,有时候需要计算两个字符串之间的相似度,也可以称作是两者之间的距离,用最小编辑距离表示. 最小编辑距离用{Insertion,Deletion,Substitution}这三种操作 ...

  6. ES6 map与filter

    ES6 map与filter 1.map let arr1 = [1,2,3]; let arr2 = arr1.map((value,key,arr) => { console.log(val ...

  7. 3.第一个MyBatis程序_进化

    1.使用工具类 将SqlSession的获取 封装成一个工具 private static SqlSession session = null; static { try { InputStream ...

  8. 实验楼Python项目

    整理几个实验楼小项目,有免费的也有会员的,会员的可以参考他们的实验报告. 直接去实验楼这个网站,粘贴上就能搜到. 免费专区: Kmeans聚类算法评估足球比赛 Python实现3D建模工具 K-近邻算 ...

  9. Some ML Tutorials

    VAE: What-is-variational-autoencoder-vae-tutorial Variational-autoencoders-explained Building variat ...

  10. 【小知识】证明 $1$ 到 $n$ 的立方和公式

    scb 发明了小学奥数(确信) Formula \(\sum\limits_{i=1}^n i^3 = (\sum\limits_{i=1}^n i)^2\) Provement 构造一个矩阵 \(a ...