这道题的题面有点问题,如果按照题面做,应该是A不了的,下面引用一下评论里@REM_001的翻译

一棵n个节点的树,行动中心S从1->N。从S出发前往任意一个未标记到的点(沿树上两点的唯一路径走),标记该节点,然后返回S。相邻两次行动所经过的道路不允许有重复,最后一次标记后不需要返回,求路程总和的最小值。

第i行输出行动中心为i时的答案,如果不可能则输出-1

这种翻译好像跟题面没什么区别啊。

别着急,下面就知道区别在哪里了。

题面要求,相邻两次到达的点不能有公共边,说白了就是以 \(S\) 为根的树每次取的点不能来自同一颗 \(S\) 的子节点的子树。那么再简化一下,就是 \(S\) 的子节点的子树节点数最大不能超过\(n/2\)。为什么呢?如果超过一半了,肯定会出现相邻啊。

那么这里就出现了一个临界值。\(n-1\)个点排成的队列,如果\(n\)是偶数,比如说是\(4\)。那么最大的子节点的子树大小最大就是\(2\)这个时候,队列的最后一个点就被确定一定是这个大小为\(2\)的子树上的点。意识到什么不对的地方了吗?

如果按照题面翻译的那样,我们是不需要考虑这种情况的,但是正确的题面可是要考虑这个临界值的啊。这也就是有的人怎么改都A不了的原因了。题面都是错的,怎么可能写对嘛。

上面我们讲了怎么判定,那么怎么求最大的子节点的子树大小呢?设 \(s[u]\) 表示以\(u\)为根的子树大小,我们先随便选一个点为根节点,然后dfs一遍求出\(s[u]\),此时的\(s[u]\)表示的是以\(u\)的父节点为根节点时,以\(u\)为根的子树大小。当以\(u\)的子节点为根节点时,以\(u\)为根的子树大小为\(n-s[u]+1\),这里很好理解,就不说为什么了。

能够判定了,我们还需要求距离和,还有最大距离。

我们定义\(w[u][0]\)表示以\(u\)为根节点的子树上的点到\(u\)的距离和,\(w[u][1]\)表示不在以\(u\)为根节点的子树上的点到\(u\)的距离和,跑两遍dfs就可以求出。然后就是求距离,这个很简单,我们在下面的程序里说

下放程序

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc getchar
#define maxn 1000005
using namespace std; inline ll read(){
ll a=0;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
}int n;ll ans; struct ahaha{
int to,next;
}e[maxn<<1];int tot,head[maxn];
inline void add(int u,int v){
e[tot].to=v,e[tot].next=head[u];head[u]=tot++;
} int f[maxn],l[maxn],s[maxn];ll w[maxn][2]; //f记录父子关系,l记录最远距离,s记录子树大小,w[0]表示下方的点的距离和,w[1]表示上方的点的距离和
int p[maxn],d1[maxn],d[maxn][2]; //p表示下方距离的最大值经过哪一个子节点,d1表示下方距离次大值,d[0]表示下方距离最大值,d[1]表示上方距离最大值
void dfs(int u,int fa){s[u]=1;
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(v==fa)continue;
dfs(v,u);f[v]=u;s[u]+=s[v]; //先递归,再处理 s的处理也很常见
w[u][0]+=w[v][0]+s[v]; //加上s[v]是加上uv相连的这条边的贡献
if(d[v][0]+1<=d1[u])continue; //如果v下方最大值+1还不如u下方次大值大,我们就可以直接走了
if(d[v][0]+1>=d[u][0]){ //如果大于等于最大值,更新次大值,更新最大值,更新最大值来源。为什么等于也可以大家可以自己想一想,很简单
d1[u]=d[u][0];
d[u][0]=d[v][0]+1,p[u]=v;
continue;
}
d1[u]=d[v][0]+1; //剩下的情况就是 d1[u]<d[v][0]+1<d[u][0] 所以更新次大值
}
}
void dfs1(int u,int fa){
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(v==fa)continue;
if(v==p[u])d[v][1]=max(d1[u],d[u][1])+1; //如果是父节点的最大值来源,那么用次大值更新
else d[v][1]=max(d[u][0],d[u][1])+1; //反之,用最大值更新
w[v][1]=(ll)n-s[v]+w[u][1]+w[u][0]-w[v][0]-s[v]; //n-s[v]表示uv相连的边的贡献,w[u][0]-w[v][0]-s[v]表示父节点的其他子节点的贡献
dfs1(v,u); //先处理,再递归
}
} int main(){memset(head,-1,sizeof head);
n=read();
if(n==1){ //对于只有一个节点的树我们直接特判
puts("0");
return 0;
}
for(int i=1;i<n;++i){ //读入所有边
int u=read(),v=read();
add(u,v);add(v,u);
}
dfs(1,-1);dfs1(1,-1); //第一遍dfs自下而上处理,第二遍自上而下
for(int u=1;u<=n;++u){
int maxa=0,a,k;
for(int i=head[u];~i;i=e[i].next){ //求出以当前节点为根,最大的子节点的子树大小,并记录是哪个子节点
int v=e[i].to;k=f[v]==u?s[v]:n-s[u];
if(k>maxa)maxa=k,a=v;
}
if((maxa<<1)>n){ //如果超过一半,必定会相邻,输出-1
puts("-1");
continue;
}
l[u]=(maxa<<1)==n?(f[a]==u?d[a][0]+1:(max(p[a]==u?d1[a]:d[a][0],d[a][1])+1)):max(d[u][0],d[u][1]); //这一行的意思是如果不是前面提到的临界值,那么直接找最大距离即可;但是如果是临界情况,并且这个子节点依然是子节点,那么就是子节点下面的最远距离+1,如果子节点之前是父节点,那么找子节点没有经过u的最长距离+1
printf("%lld\n",(w[u][0]+w[u][1]<<1)-l[u]); //最后输出答案即可
}
return 0;
}

这道题留给我们一个教训,就是不要过分相信翻译,毕竟谁都可以递交翻译

看完不妨留个推荐?

P3525 INS-Inspection的更多相关文章

  1. 在Revit中如何显示附件模块(Add Ins) 这个命令页?zz

      分类: 概念说明 Revit Revit界面编程 Revit 二次开发入门2013-08-22 13:58 1395人阅读 评论(9) 收藏 举报 在windows 7 32-bit OS 上装了 ...

  2. HTML 文本格式化<b><big><em><i><small><strong><sub><sup><ins><del>

    <b> 标签-粗体 定义和用法: <b>标签规定粗体文本. 提示和注释 注释:根据 HTML5 规范,在没有其他合适标签更合适时,才应该把 <b> 标签作为最后的选 ...

  3. 解决author波浪线Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click

    自从把默认的头注释的author改成自己的名字以后越看越顺眼,但是发现名字下面一直有个波浪线,强迫症简直不能忍. 然后当你把鼠标放上去,再点击提示上的"more",会看到下面的提示 ...

  4. Inspection info: Checks Spring Boot application .properties configuration files. Highlights unresolved and deprecated configuration keys and in

    Cannot resolve class or package ‘jdbc’ less… (Ctrl+F1) Inspection info: Checks Spring Boot applicati ...

  5. windows安装oracle遇INS 30131 错误

    win2008 64位安装oracle 11.2.0.4也遇到INS 30131 错误 描述: 原因 - 无法访问临时位置. 操作 - 请确保当前用户具有访问临时位置所需的权限. 附加信息: - 所有 ...

  6. pycharm提示This inspection detects instance attribute definition outside __init__ method

    示例代码: class MiNiCarStore(CarStore): def createCar(self, typeName): self.carFactory = CarFactory() # ...

  7. pycharm提示This inspection detects any methods which may safely be made static.

    示例代码: class Car(object): # 未定义任何类属性 def move(self): # 方法会出现下划线提示This inspection detects any methods ...

  8. this inspection detects names that should resolved but don't. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are sup

    输入第一行代码:import logging;logging.basicConfig(level==logging.INFO) 提示:this inspection detects names tha ...

  9. 警告: No data sources are configured to run this SQL and provide advanced code assistance. Disable this inspection via problem menu (Alt+Enter). more... (Ctrl+F1) SQL dialect is not configured. Postgr

    python3出现问题: 警告: No data sources are configured to run this SQL and provide advanced code assistance ...

  10. 从模板驱动文件ins生成cls文件

    在当前目录下,启动cmd程序,输入以下指令: latex acmart.ins

随机推荐

  1. Parallel.ForEach 使用多线遍历循环

    Parallel.ForEach相对于foreach是多线程,并行操作;foreach是单线程品德操作. static void Main(string[] args) { Console.Write ...

  2. react学习之弹出层

    react的弹出层不同于以往的DOM编程,我们知道,在DOM中,弹出层事件绑定在对应的节点上即可,但是在react中,往往只能实现父子之间的传递控制,显然,弹出层的层级不符合此关系. 在这里我们需要使 ...

  3. Python 函数和类

    python作为一个面向对象的语言,也有类似java等面向对象语言相同的数据结构(class)的定义,和代码块数据结构定义"函数".为了极大可能的简化代码调用逻辑和书写规则,pyt ...

  4. Cnblogs图片无法上传

      2019年5月28日以前的两三个月时间,使用cnblogs原来的接口时,提示图片无法上传,空间不足,实在没办法了,自己实现了博客代理,发现上传图片时返回了503错误,只好先把图片传到其它服务器,再 ...

  5. windows系统搭建zookeeper

    安装&配置 在apache的官方网站提供了好多镜像下载地址,然后找到对应的版本 下载地址: http://mirrors.cnnic.cn/apache/zookeeper/zookeeper ...

  6. right join 和left join 的区别

    SQL 数据库 right join 和left join 的区别   left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中 ...

  7. 2019阿里天猫团队Java高级工程师面试题之第一面

    2019阿里天猫团队Java高级工程师面试题之第二面 2019阿里天猫团队Java高级工程师面试题之第三面 1.五分钟自我介绍,说说自己的擅长及拿手的技术 自我介绍是为了考察面试者的语言表达和总结概括 ...

  8. C语言程序设计100例之(15):除法算式

    例15   除法算式 问题描述 输入正整数n(2≤n≤68),按从小到大输出所有形如abcde/fghi=n的表达式.其中a~i为1~9的一个排列. 输入格式 每行为一个正整数n (n <= 1 ...

  9. 巧妙利用label标签实现input file上传文件自定义样式

    提到上传文件,一般会想到用input file属性来实现,简单便捷,一行代码即可    但input file原生提供的默认样式大多情况下都不符合需求,且在不同浏览器上呈现的样式也不尽相同   我们往 ...

  10. Xmind软件——xmind 8 pro下载激活推荐!!

    亲测有效,在csdn上找到一个. 下载激活xmind 8 pro链接