https://zybuluo.com/ysner/note/1246822

题面

有三棵树,建两条边让他们相连,最大化所有点对距离之和。

  • \(40pts\ n\leq1000\)
  • \(100pts\ n\leq10^5\)

解析

\(40pts\)算法

似乎是怎么暴力怎么搞。

先预处理出三棵树内所有点对的距离\(dis\)和每一个点到其他点的距离和\(sum\),然后枚举最后另两颗树接到哪棵树上。

接着举例推导两颗树相连时对答案新产生的贡献(考场上推了\(1h\)???)

设建的边两端点分别是\(u\)点,对应\(A\)树,大小为\(size[A]\);

\(v\)点,对应\(B\)树,大小为\(size[B]\)。hree Trees

边长为\(len\)。

则贡献为$$sum[u]size[B]+lensize[A]size[B]+sum[v]size[A]$$

(这是整道题的钥匙)

然后枚举另两棵树接在第三棵树的哪个点上,同时计算答案即可。

答案中要同时统计:(设\(A\),\(C\)两树接到\(B\)上)

  • \(A,B,C\)三树各自内部的点对距离和
  • \(A,B\)两树产生的点对距离和
  • \(B,C\)两树产生的点对距离和
  • \(A,C\)两树产生的点对距离和

都是直接套用上面的式子。

复杂度\(O(n^2)\)。

\(100pts\)算法

注意到\(O(n^2)\)求\(sum\)似乎很傻逼。

可以换种思路,两次\(O(n)\)的树形\(DP\)解决。

第一次统计子树大小\(sz\)和子树所有点到根结点的距离之hree Trees和\(sum\)。

设\(u\)为父结点,\(v\)为子结点。

则\(sz[u]+=sz[v],sum[u]+=sz[v]+sum[v]\)。

第二次应用换根思想。

想一想若根变为儿子,原有的\(sum\)会怎么变化。

首先到\(n-sz[v]\)个点的距离会全部\(+1\)。

其次,每次往\(v\)移,\(sum\)都需新加上\(u\)结点的其他儿子及子树的贡献(\(u\)子树外的贡献都被\(u\)点统计过了)。

若设父亲\(sum\)加上的值为\(x\),

则儿子\(sum\)加上的值为\(x+n-sz[v]+sum[u]-sum[v]-sz[v]\)

于是预处理复杂度降到\(O(n)\)。

接着发现枚举另两棵树接在第三棵树的哪个点上,是复杂度瓶颈。

但是,如设\(B\)树\(sum\)值最大的点为\(j\),那么可以猜出接一棵树在上面肯定不会不优(由那个式子决定)。

于是只要枚举另一棵树接在哪个结点上即可。

由于要现算\(len\),复杂度\(O(nlogn)\)。

注意下式子运算过程中是否乘爆。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define re register
#define il inline
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=2e5+100,inf=1e9;
ll ans;
struct Tree
{
int h[N],cnt,sz[N],pos,son[N],top[N],f[N];
ll mx,tot[N],sum[N],dd,d[N],n;
il Tree(){memset(h,-1,sizeof(h));cnt=0;pos=1;}
struct Edge{int to,nxt;}e[N<<1];
il void add(re int u,re int v){e[++cnt]=(Edge){v,h[u]};h[u]=cnt;e[++cnt]=(Edge){u,h[v]};h[v]=cnt;}
il void dfs1(re int u,re int fa)
{
sz[u]=1;f[u]=fa;d[u]=d[fa]+1;
for(re int i=h[u];i+1;i=e[i].nxt)
{
re int v=e[i].to;
if(v==fa) continue;
dfs1(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]]) son[u]=v;
sum[u]+=sz[v]+sum[v];
}
}
il void dfs2(re int u,re int up)
{
top[u]=up;
if(son[u]) dfs2(son[u],up);
for(re int i=h[u];i+1;i=e[i].nxt)
{
re int v=e[i].to;
if(v==f[u]||v==son[u]) continue;
dfs2(v,v);
}
}
il void dfs3(re int u,re int fa,re ll las)
{
tot[u]=sum[u]+las;dd+=tot[u];
if(tot[u]>mx) mx=tot[u],pos=u;
for(re int i=h[u];i+1;i=e[i].nxt)
{
re int v=e[i].to;
if(v==fa) continue;
dfs3(v,u,las+n-sz[v]+sum[u]-sum[v]-sz[v]);
}
}
il int LCA(re int u,re int v)
{
while(top[u]^top[v])
{
if(d[top[u]]<d[top[v]]) swap(u,v);
u=f[top[u]];
}
return d[u]<d[v]?u:v;
}
il ll Dis(re int u,re int v){return d[u]+d[v]-2*d[LCA(u,v)];}
}T[4];
il void calc(re int A,re int B,re int C)
{
re ll s=(T[A].dd+T[B].dd+T[C].dd)+(T[A].mx*T[B].n+T[A].n*T[B].n+T[B].mx*T[A].n)+(T[C].mx*T[B].n+T[B].n*T[C].n+0)+(T[A].mx*T[C].n+0+T[C].mx*T[A].n),ysn=0;
fp(i,1,T[B].n) ysn=max(ysn,T[B].tot[i]*T[C].n+(T[B].Dis(T[B].pos,i)+2)*T[A].n*T[C].n);
ans=max(ans,s+ysn);
}
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
int main()
{
T[1].n=gi();T[2].n=gi();T[3].n=gi();
fp(i,1,T[1].n-1) T[1].add(gi(),gi());
fp(i,1,T[2].n-1) T[2].add(gi(),gi());
fp(i,1,T[3].n-1) T[3].add(gi(),gi());
fp(i,1,3) T[i].dfs1(1,0),T[i].dfs2(1,1),T[i].dfs3(1,0,0),T[i].dd/=2;
fp(i,1,3)
fp(j,1,3)
{
if(i==j) continue;
calc(i,j,6-i-j);
}
printf("%lld\n",ans);
return 0;
}

[CF391E2]Three Trees的更多相关文章

  1. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  2. hdu2848 Visible Trees (容斥原理)

    题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...

  3. [LeetCode] Minimum Height Trees 最小高度树

    For a undirected graph with tree characteristics, we can choose any node as the root. The result gra ...

  4. [LeetCode] Unique Binary Search Trees 独一无二的二叉搜索树

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  5. [LeetCode] Unique Binary Search Trees II 独一无二的二叉搜索树之二

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  6. 2 Unique Binary Search Trees II_Leetcode

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  7. Finger Trees: A Simple General-purpose Data Structure

    http://staff.city.ac.uk/~ross/papers/FingerTree.html Summary We present 2-3 finger trees, a function ...

  8. Christmas Trees, Promises和Event Emitters

    今天有同事问我下面这段代码是什么意思: var MyClass = function() { events.EventEmitter.call(this); // 这行是什么意思? }; util.i ...

  9. 【leetcode】Unique Binary Search Trees (#96)

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

随机推荐

  1. Linux的net.ipv4.tcp_timestamps参数

    Q1 今天发生了一个奇怪的现象,在家里始终打开公司的网站打开不了,我就齐了怪了,然后我就各种测试,从ping到dig域名,然后再curl,都是没有问题的,但是就是打不开,最好没有办法只能抓包了,从抓包 ...

  2. Linux 应用总结:自动删除n天前的日志

    linux是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种爽快的事情.不用你去每天惦记着是否需要清理日志 ...

  3. np.tile(), np.repeat() 和 tf.tile()

    以上三个函数,主要区别在于能够拓展维度上和重复方式: np.tile() 能够拓展维度,并且整体重复: a = np.array([0,1,2]) np.tile(a,(2,2)) # out # a ...

  4. No buffer space available错误解决方案

    生产环境,突然爆发问题,网络正常,但是报网络不通错误,重启tomcat立刻好使 开始以为是tomcat的问题,调查了很久,后来加上堆栈日志才发现 简单来说,就是1-4分钟之内,使用了大量的http请求 ...

  5. 添物零基础到大型全栈架构师 Java实战及解析(实战篇)- 概述

    ​ 实战篇是在基础之上,进一步提升的内容.通过实战篇可以深入理解Java相关框架和库的使用,能够独立开发小模块,或者按照架构师的指导进行代码编写和完善. 主要讲解核心框架和库的使用和使用场景介绍.通过 ...

  6. HDU 1203 背包问题

    题目大意: 根据学校的申请费用,根据已有的钱得到最大的offer率 这里很明显就是一个价值为概率的背包问题 计算两个offer合并的概率 为a + b - a*b #include <cstdi ...

  7. [luoguP2758] 编辑距离(DP)

    传送门 f[i][j] 表示第一串前 i 个到第二串前 j 个的最小编辑距离 f[i][j] = f[i - 1][j - 1] (s1[i] == s2[j]) f[i][j] = min(f[i ...

  8. Maven项目pom.xml报错

    1.org.apache.maven.archiver.MavenArchiver.getManifest报错 pom.xml第一行报错,如图: 解决办法: 第一步: help ->Instal ...

  9. Java虚拟机深入JVM内核—原理、诊断与优化视频教程

    http://www.eimhe.com/forum.php?mod=viewthread&tid=142832&highlight=%C4%DA%BA%CB

  10. react-浏览后的想法