codeforces708C
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的更多相关文章
- Codeforces708C Centroids 【树形dp】
题目链接 题意:给定一棵n个结点的树,问:对于每个结点,能否通过删除一条边并添加一条边使得仍是树,并且删除该结点后得到的各个连通分量结点数 <= n/2? 题解:树形dp,两遍dfs,第一遍df ...
- Codeforces-708C(树形DP)
一.题意 给定一颗树,对于每一个节点,判断能否在树中删除某一条边,然后在任意两个节点之间加一条边,使这个点成为重心. 注:删除树中某一条边后,标程并不会这么无聊地把这棵树变成两个孤立的连通图,而是再让 ...
随机推荐
- 基于LINUX下的进程管理问题
什么是进程? 程序(program)放置在存储媒体中(如硬盘,光盘,软盘,磁带等)为实体文件的形态存在 进程:程序被触发后,执行者的权限与属性,程序的程序码与所需数据等都会被载入内存中,操作系统并给予 ...
- 使用 backdoor 工具注入ShellCode
backdoor-factory 顾名思义,直接翻译过来就是后门工厂的意思.其利用打补丁的方式编码加密PE文件,可以轻松的生成win32PE后门程序,从而帮助我们绕过一些防病毒软件的查杀,达到一定得免 ...
- hdu 1502 大数dp
对于每一个dp的问题 从其最优解的结构(分哪几种形式或者情况)入手 然后分析状态 这样就比较好找出状态转方程这里数据结构的选择很简单 顺序数组就可以 填充的方式顺序填充就可以 然后这道题目卡了我大数. ...
- javascript中用&&跟||来简化if{}else{}的写法
原文:javascript中用&&跟||来简化if{}else{}的写法 目录 javascript中用&&跟||来简化if{}else{}的写法 1. if else ...
- npm无法安装node-sass的解决方法
使用npm install 命令安装node-sass时,经常出现安装失败的情况.原因在于npm服务器在美国,还有就是某强大的防火墙作用.导致模块无法下载. npm install node-sass ...
- tinymce富文本是在modal框中弹出显示的问题
记录一下,在用tinymce富文本的时候,由于是用在modal 上的,始终无法获取焦点,后来才发现问题出在tinymce在modal前创建了,所以导致这个问题,解决方案就是用 v-if="v ...
- TypeScript入门二:基本数据类型
浅析基本数据类型 TypeScript类型解析 一.浅析基本数据类型 首先有一个问题TypeScript是一门编译型语言?还是解释性语言?显然已经不能被这两个分类来区分,TypeScript的并不是为 ...
- DVA-subscriptions
import { routerRedux } from 'dva/router' export default { namespace: 'notice', state: { notices:[], ...
- 使用python+selenium获得b站今日播放的动漫
from selenium import webdriver browser=webdriver.Chrome() browser.get('https://www.bilibili.com/anim ...
- 使用openSSL构造一个支持https的nodejs服务器
首先通过下面的链接下载openSSL https://slproweb.com/products/Win32OpenSSL.html 下载完毕后,执行openssl进入交互式界面: 使用命令生成pri ...