Description

Link.

给定一棵 \(n\) 个点的树,设 \(E\) 为边集,\(V'_x,\ V'_y\) 分别为删去边 \((x,y)\) 后 点 \(x\) 所在的树的点集和点 \(y\) 所在的树的点集,求:

\[\sum_{(u,v)\in E}(\sum_{x\in V'_{u}}[x\text{ is the centroid of }V'_{u}]\times x+\sum_{y\in V'_{v}}[y\text{ is the centroid of }V'_{v}]\times y)
\]

Solution

重心,想到重儿子,我们记一个结点 \(u\) 的重儿子为 \(hb_{u}\)。

对于 \(\text{subtree}(u)\),如果 \(u\) 不是 \(\text{subtree}(u)\) 的 centroid,那么 \(\text{subtree}(u)\) 的 centroid 一定在 \(\text{subtree}(hb(u))\) 里。

然后我们找到对于 \(u\) 最深的一个重儿子 \(v\)(就是重链上的某个结点),满足 \(siz_{u}-siz_{v}\le\frac{siz_{u}}{2}\),那么 \(v\) 就是重心(还有 \(fa_{v}\) 需要判断一下)。

对于这道题,我们直接枚举每条边 \((u,v)\),设 \(u\) 比 \(v\) 浅,那么 \(v\) 就是 \(V'_{v}\) 的根,直接套就可以了。

对于 \(u\),我们换个根也就出来了,具体来说是交换 \((u,v)\) 的父子关系,不然直接交换 \((1,x)\) 太劣。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
vector<int> e[300010];
int t,n,siz[300010],hb[300010][20],fa[300010];
LL ans;
void dfs(int x,int las)
{
siz[x]=1,fa[x]=las;
for(unsigned int i=0;i<e[x].size();++i)
{
int y=e[x][i];
if(y^las)
{
dfs(y,x);
siz[x]+=siz[y];
if(siz[y]>siz[hb[x][0]]) hb[x][0]=y;
}
}
for(int i=1;i^20;++i) hb[x][i]=hb[hb[x][i-1]][i-1];
}
void cgfather(int x,int y)
{
siz[x]-=siz[y],siz[y]+=siz[x];
fa[x]=y,fa[y]=0;
if(hb[x][0]==y)
{
hb[x][0]=0;
for(unsigned int i=0;i<e[x].size();++i) if((e[x][i]^y)&&siz[e[x][i]]>siz[hb[x][0]]) hb[x][0]=e[x][i];
for(int i=1;i^20;++i) hb[x][i]=hb[hb[x][i-1]][i-1];
}
if(siz[x]>siz[hb[y][0]])
{
hb[y][0]=x;
for(int i=1;i^20;++i) hb[y][i]=hb[hb[y][i-1]][i-1];
}
}
void getans(int x)
{
#define eplist(x,all) (max(siz[hb[x][0]],(all)-siz[x])<=((all)>>1))
int now=x;
for(int i=19;~i;--i) if(hb[now][i]&&siz[x]-siz[hb[now][i]]<=(siz[x]>>1)) now=hb[now][i];
if(eplist(now,siz[x])) ans+=now;
if(eplist(fa[now],siz[x])) ans+=fa[now];
#undef eplist
}
void exdfs(int x,int las)
{
for(unsigned int i=0;i<e[x].size();++i)
{
int y=e[x][i];
if(y^las)
{
getans(y);
cgfather(x,y);
getans(x);
exdfs(y,x);
cgfather(y,x);
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1,x,y;i<n;++i)
{
scanf("%d %d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0),exdfs(1,0);
printf("%lld\n",ans);
for(int i=1;i<=n;++i) e[i].clear(),siz[i]=hb[i][0]=fa[i]=0;
ans=0;
}
return 0;
}

Solution -「CSP 2019」Centroid的更多相关文章

  1. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  2. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  3. Solution -「CCO 2019」「洛谷 P5532」Sirtet

    \(\mathcal{Description}\)   Link.   在一个 \(n\times m\) 的网格图中,每个格子上是空白 . 或沙子 #,四联通的沙子会连成一个整体.令此时所有沙子块同 ...

  4. Solution -「ZJOI 2019」「洛谷 P5326」开关

    \(\mathcal{Description}\)   Link.   有 \(n\) 个开关,初始时所有开关的状态为 \(0\).给定开关的目标状态 \(s_1,s_2,\cdots,s_n\).每 ...

  5. Solution -「JOISC 2019」「LOJ #3036」指定城市

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,双向边权不相同.\(q\) 次询问,每次询问在树上标记 \(e\) 个点,标记的价值为所有趋 ...

  6. Solution -「ROI 2019」「LOJ #3192」课桌

    \(\mathcal{Description}\)   Link.   原题意足够简洁啦.( \(\mathcal{Solution}\)   乍一看比较棘手,但可以从座位的安排方式入手,有结论:   ...

  7. Solution -「HNOI 2019」「洛谷 P5293」白兔之舞

    \(\mathcal{Description}\)   Link.   不想概括题意.jpg \(\mathcal{Solution}\)   定义点集 \(S_c=\{(u,v)|v=c\}\):第 ...

  8. 「WC 2019」数树

    「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...

  9. LOJ#3054. 「HNOI 2019」鱼

    LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...

  10. #3146. 「APIO 2019」路灯

    #3146. 「APIO 2019」路灯 题目描述 一辆自动驾驶的出租车正在 Innopolis 的街道上行驶.该街道上有 \(n + 1\) 个停车站点,它们将街道划分成了 \(n\) 条路段.每一 ...

随机推荐

  1. Kruskal 重构树

    Kruskal 重构树 是一棵二叉树,一张 \(N\) 个点的无向连通图的 Kruskal 重构树有 \(2N-1\) 个节点. 叶子节点为原图中节点,非叶子节点有点权,表示想在原图上从一边的子树内的 ...

  2. JavaWeb编程面试题——导航

    引言 面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待.不以刷题进大厂为目的,而是以学习为目的.这里的知识点会持续更新,目录也会随时进行调整. 关注公众号:编 ...

  3. .NET周报 【6月第1期 2023-06-04】

    专题 - NanoFramework项目案例 如果有时间,我会在周报中加入一些专题和项目案例的分享,本周就是讨论.NET NanoFramework项目案例的专题,在讨论 NanoFramework ...

  4. 常量接口 vs 常量类 vs 枚举区别

    把常量定义在接口里与类里都能通过编译,那2者到底有什么区别呢? 那个更合理? 常量接口 public interface ConstInterfaceA { public static final S ...

  5. 前端vue自定义简单实用下拉筛选 下拉菜单

    前端vue自定义简单实用下拉筛选 下拉菜单, 下载完整代码请访问: https://ext.dcloud.net.cn/plugin?id=13020 效果图如下:     #### 使用方法 ``` ...

  6. 将 -Xms 参数设置和-Xmx 参数的相等,对比 -Xms参数 设置为-Xmx 参数的一半,有哪些优势?

    将 -Xms 参数设置为与 -Xmx 参数相等,相比于将 -Xms 参数设置为 -Xmx 参数的一半,具有以下优势: 1. 程序启动时间更短 当将 -Xms 参数设置为与 -Xmx 参数相等时,JVM ...

  7. 自然语言处理 Paddle NLP - 预训练模型产业实践课-理论

    模型压缩:理论基础 模型压缩基本方法分为三类: 量化 裁剪 蒸馏 量化 裁剪 绿线:随机裁剪 30% 已经扛不住了 蓝线:60% 还不错 蒸馏 蒸馏任务与原来的学习任务同时进行. 对于没有标注的数据, ...

  8. 使用docker构建可动态启动的FreeSWITCH实例

    操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Docker版本:23.0.6   使用docker打包FreeSWITCH可以极大简化部署环节,但针对高可用场景的 ...

  9. 使用 vscode 远程登陆自己的电脑/服务器 (不需要内网穿透 😇)

    问题背景 最近有远程调试的需求,从笔记本连入配置比较高的电脑(windows)运行代码,查阅资料后,了解到大致就是两个方法: 共享屏幕远程控制,如 to desk, 向日葵 内网穿透 + ssh 第一 ...

  10. TCP的Keep-Alive机制:链接存在但是没有数据传输,内核怎么处理

    服务端/客户端会定期发送探测报文来检测客户端的存活状态. 由三个内核参数控制: 首次发送探测报文时间:net.ipv4.tcp_keepalive_time有报文传输时重置 探测报文的发送间隔:net ...