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. 自然语言处理 Paddle NLP - 快递单信息抽取 (ERNIE 1.0)

    文档检索:需要把业务问题拆解成子任务.文本分类 -> 文本匹配 -> 等任务 -> Panddle API 完成子任务 -> 子任务再拼起来 介绍 在2017年之前,工业界和学 ...

  2. HLS AES加密

    HLS AES加密 HLS AES加密介绍 HLS AES加密是一种用于保护HLS流内容安全的加密技术.它通过将HLS媒体文件进行分段,并使用AES加密算法对每个片段进行加密,从而防止未经授权的访问和 ...

  3. Python常用基础知识整理

    一.Python转义字符 \a :响铃(BEL) \b : 退格(BS) ,将当前位置移到前一列 \f :换页(FF),将当前位置移到下页开头 \n :换行(LF) ,将当前位置移到下一行开头 \r ...

  4. 国标GB28181协议客户端开发(三)查询和实时视频画面

    国标GB28181协议客户端开发(三)查询和实时视频画面 本文是<国标GB28181协议设备端开发>系列的第三篇,探讨了信息查询和实时视频在GB28181协议中的应用.首先,介绍了设备目录 ...

  5. ASP.NET Core 6框架揭秘实例演示[42]:检查应用的健康状况

    现代化的应用及服务的部署场景主要体现在集群化.微服务和容器化,这一切都建立在针对部署应用或者服务的健康检查上.ASP.NET提供的健康检查不仅可能确定目标应用或者服务的可用性,还具有健康报告发布功能. ...

  6. 我是如何组织 Go 代码的(目录结构 依赖注入 wire)

    背景 对于大多数 Gopher 来说,编写 Go 程序会直接在目录建立 main.go,xxx.go,yyy.go-- 不是说不好,对于小型工程来说,简单反而简洁明了,我也提倡小工程没必要整一些花里胡 ...

  7. 包管理工具npm和Yarn的区别,我们该如何选择?

    好家伙,学习新工具    1.为什么我们需要包管理器? 关于npm我们已经知道了,这是我们项目的包管理器, 我们现在用的无比顺手的工具,都是在无数的竞争中杀出来的,他们淘汰了无数的产品   首先,倘若 ...

  8. 《最新出炉》系列入门篇-Python+Playwright自动化测试-9-页面(page)

    1.简介 通过前边的讲解和学习,细心认真地小伙伴或者童鞋们可能发现在Playwright中,没有Element这个概念,只有Page的概念,Page不仅仅指的是某个页面,例如页面间的跳转等,还包含了所 ...

  9. IIC总线学习笔记

    IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板.嵌入式系统或手 ...

  10. chrome pre 自动换行

    问题引出 当我想要使用chrome的打印功能生成一份关于md的pdf版本的时候发现有的代码块没有自动换行,生成的PDF没有自动换行,导致部分信息无法阅读 处理方式 把有自动换行的部分处理一下,在md文 ...