[POI2011]Inspekcja

题目大意:

给你一棵\(n(n\le10^6)\)个点的树,\(s\)为起点。每次选择一个点作为目标点\(t_i\),沿最短路走到\(t_i\)再走回\(s\)(最后一次除外)。相邻两次行动不能经过相同的边。问将每一个点作为\(s\),是否存在一种方案使得除\(s\)外的所有结点都作为目标点被恰好访问一次,如果是,求最小路径和。

思路:

存在合法方案当且仅当去掉\(s\)后剩下的连通块中,最大的连通块大小不超过其余连通块大小之和。

这样的点一定是重心(反过来不一定),因此最多就不超过两个。

答案就是以这个点为根后所有点深度和×2-最大深度。

注意如果恰好有一个子树大小为\(\frac n2\),则最后删掉的深度一定在这棵子树中。

源代码:

#include<cstdio>
#include<cctype>
#include<vector>
#include<climits>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int N=1e6+1;
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
e[v].push_back(u);
}
int n,size[N],max[N],dep[N],far[N];
void dfs1(const int &x,const int &par) {
size[x]=1;
for(unsigned i=0;i<e[x].size();i++) {
const int &y=e[x][i];
if(y==par) continue;
dfs1(y,x);
size[x]+=size[y];
max[x]=std::max(max[x],size[y]);
}
max[x]=std::max(max[x],n-size[x]);
}
void dfs2(const int &x,const int &par) {
far[x]=0;
size[x]=1;
dep[x]=dep[par]+1;
for(unsigned i=0;i<e[x].size();i++) {
const int &y=e[x][i];
if(y==par) continue;
dfs2(y,x);
size[x]+=size[y];
far[x]=std::max(far[x],far[y]+1);
}
}
int main() {
n=getint();
max[0]=n+1;
dep[0]=-1;
for(register int i=1;i<n;i++) {
add_edge(getint(),getint());
}
dfs1(1,0);
for(register int x=1;x<=n;x++) {
if(max[x]>n/2) {
puts("-1");
continue;
}
dfs2(x,0);
int max=0;
int64 sum=0;
for(register int i=1;i<=n;i++) {
sum+=dep[i];
max=std::max(max,dep[i]);
}
for(register unsigned i=0;i<e[x].size();i++) {
const int &y=e[x][i];
if(size[y]==n/2) max=far[y]+1;
}
printf("%lld\n",sum*2-max);
}
return 0;
}

[POI2011]Inspekcja的更多相关文章

  1. BZOJ2527: [Poi2011]Meteors

    补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...

  2. BZOJ2276: [Poi2011]Temperature

    2276: [Poi2011]Temperature Time Limit: 20 Sec  Memory Limit: 32 MBSubmit: 293  Solved: 117[Submit][S ...

  3. BZOJ2213: [Poi2011]Difference

    2213: [Poi2011]Difference Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 343  Solved: 108[Submit][St ...

  4. BZOJ2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 391  Solved: 127[Submi ...

  5. BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )

    线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...

  6. bzoj 2217 [Poi2011]Lollipop 乱搞 贪心

    2217: [Poi2011]Lollipop Time Limit: 15 Sec  Memory Limit: 64 MBSec  Special JudgeSubmit: 383  Solved ...

  7. BZOJ_2529_[Poi2011]Sticks_贪心

    BZOJ_2529_[Poi2011]Sticks_贪心 Description Little Johnny was given a birthday present by his grandpare ...

  8. BZOJ_2212_[Poi2011]Tree Rotations_线段树合并

    BZOJ_2212_[Poi2011]Tree Rotations_线段树合并 Description Byteasar the gardener is growing a rare tree cal ...

  9. BZOJ_2527_[Poi2011]Meteors_整体二分

    BZOJ_2527_[Poi2011]Meteors_整体二分 Description Byteotian Interstellar Union (BIU) has recently discover ...

随机推荐

  1. SharePoint 2013 Workflow Manager 1.0 远程服务器返回错误: (400) 错误的请求。 不支持查询字符串中的 api-version

    环境: Windows Server 2012 R2 Standard SharePoint Server 2013 with sp1 通过Web 平台安装程序 5.0,已安装 Workflow Ma ...

  2. windows系统下安装tomcat及配置

    1.安装测试 1.安装 推荐使用免安装版的Tomcat(放在没有中文和空格的目录下),前提是已经安装了JDK并配置了环境变量. 2.测试 双击startup.bat,浏览器输入url:localhos ...

  3. 017_mac格式化硬盘,mac如何格式化硬盘

    想做一个mac和windows都能识别的系统,推荐设置成什么格式 一.在mac下格式化 在Mac 下,打开右下角应用程序-实用工具-磁盘工具,里面选取你的移动硬盘,然后进行格式化,设置成EXFat格式 ...

  4. openwrt 添加luci选项

    刚刚下载的openwrt trunk版本,安装后没有luci选项,如下图 需要添加luci页面选项. 步骤如下: (1)修改配置文件 .config , 将 CONFIG_FEED_luci is n ...

  5. keepalived实现haproxy负载均衡器的高可用

    一.keepalived简介 keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于,用来防止单点故障. 二.vrrp协议2.1 vrrp协议简介 在现实的网络环境中,两台需要通信 ...

  6. RestTemplate的使用

    1.postForObject :传入一个业务对象,返回是一个String 调用方: BaseUser baseUser=new BaseUser(); baseUser.setUserid(user ...

  7. 面向对象编程其实很简单——Python 面向对象(初级篇)

    出处:http://www.cnblogs.com/wupeiqi/ 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函 ...

  8. 【splunk】启动停止

    在控制台 splunk目录/bin下 ./splunk start #启动 ./splunk stop #停止 启动时出错,需要更改一下SPLUNK的配置 $SPLUNK_HOME/etc/splun ...

  9. JVM内存管理概述

    1.概述 java不在需要开发人员显示的分配内存和回收内存,而是由JVM自动管理内存的分配和回收(又称为垃圾回收-GC),这简化了编程难度,但同时可能使得程序员在不知不觉中浪费了很多内存,导致JVM花 ...

  10. PHP数学常用函数

    PHP数学常用函数 函数名 描述 实例 abs() 求绝对值 $abs = abs(-4.2); //4.2 fmod() 浮点数取余 $x = 5.7;$y = 1.3;$r = fmod($x, ...