Solution -「CSP 2019」Centroid
Description
Link.
给定一棵 \(n\) 个点的树,设 \(E\) 为边集,\(V'_x,\ V'_y\) 分别为删去边 \((x,y)\) 后 点 \(x\) 所在的树的点集和点 \(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的更多相关文章
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...
- Solution -「JSOI 2019」「洛谷 P5334」节日庆典
\(\mathscr{Description}\) Link. 给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的). \(|S|\le3\time ...
- Solution -「CCO 2019」「洛谷 P5532」Sirtet
\(\mathcal{Description}\) Link. 在一个 \(n\times m\) 的网格图中,每个格子上是空白 . 或沙子 #,四联通的沙子会连成一个整体.令此时所有沙子块同 ...
- Solution -「ZJOI 2019」「洛谷 P5326」开关
\(\mathcal{Description}\) Link. 有 \(n\) 个开关,初始时所有开关的状态为 \(0\).给定开关的目标状态 \(s_1,s_2,\cdots,s_n\).每 ...
- Solution -「JOISC 2019」「LOJ #3036」指定城市
\(\mathcal{Description}\) Link. 给定一棵含 \(n\) 个结点的树,双向边权不相同.\(q\) 次询问,每次询问在树上标记 \(e\) 个点,标记的价值为所有趋 ...
- Solution -「ROI 2019」「LOJ #3192」课桌
\(\mathcal{Description}\) Link. 原题意足够简洁啦.( \(\mathcal{Solution}\) 乍一看比较棘手,但可以从座位的安排方式入手,有结论: ...
- Solution -「HNOI 2019」「洛谷 P5293」白兔之舞
\(\mathcal{Description}\) Link. 不想概括题意.jpg \(\mathcal{Solution}\) 定义点集 \(S_c=\{(u,v)|v=c\}\):第 ...
- 「WC 2019」数树
「WC 2019」数树 一道涨姿势的EGF好题,官方题解我并没有完全看懂,尝试用指数型生成函数和组合意义的角度推了一波.考场上只得了 44 分也暴露了我在数数的一些基本套路上的不足,后面的 \(\ex ...
- LOJ#3054. 「HNOI 2019」鱼
LOJ#3054. 「HNOI 2019」鱼 https://loj.ac/problem/3054 题意 平面上有n个点,问能组成几个六个点的鱼.(n<=1000) 分析 鱼题,劲啊. 容易想 ...
- #3146. 「APIO 2019」路灯
#3146. 「APIO 2019」路灯 题目描述 一辆自动驾驶的出租车正在 Innopolis 的街道上行驶.该街道上有 \(n + 1\) 个停车站点,它们将街道划分成了 \(n\) 条路段.每一 ...
随机推荐
- Scalpel:解构API复杂参数Fuzz的「手术刀」
Scalpel简介 Scalpel是一款自动化Web/API漏洞Fuzz引擎,该工具采用被动扫描的方式,通过流量中解析Web/API参数结构,对参数编码进行自动识别与解码,并基于树结构灵活控制注入位点 ...
- selenium4-获取页面元素相关信息
本小节我们简单说下如何使用selenium4-获取页面元素相关信息,以及获取页面元素的相关信息后可以做什么. 获取页面元素的主要目的:(1)执行完步骤后进行断言:(2)获取前一步骤的响应结果作为后续步 ...
- [ARM汇编]计算机原理与数制基础—1.1.2 二进制与十进制数制转换
在计算机中,我们通常使用二进制数制来表示数据,因为计算机的基本电平只有两种状态:高电平(通常表示为 1)和低电平(通常表示为 0).而在我们的日常生活中,我们习惯使用十进制数制.为了方便理解,我们需要 ...
- 前端树形结构图组件 tree组件,可拖拽移动,点击展开收缩,无限添加子集
快速实现树形结构图组件 tree组件,可拖拽移动,点击展开收缩,无限添加子集; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=1 ...
- XHbuilder 需要的 ipa 签名,超详细的教程,你不看吃亏的是自己!
今天使用 hbuilder 运行到 ios 真机的时候,突然发现还需要 ipa 签名,这是什么东东呢? 1.IPA 签名是什么? 因苹果公司禁止企业证书用于非企业内部开发者.所以开发者无法再使用DCl ...
- PostgreSQL 12 文档: SQL 语法
SQL 命令 这部分包含PostgreSQL支持的SQL命令的参考信息.每条命令的标准符合和兼容的信息可以在相关的参考页中找到. 目录 ABORT - 中止当前事务 ALTER AGGREGATE ...
- 脱发秘籍:前端Chrome调试技巧汇总
Chrome浏览器调试工具的核心功能: 注:本文测试.截图均为Edge浏览器(内核是Chromium),浏览器内核可了解<有哪些浏览器/内核?> 00.基础操作汇总 操作类型 快捷键/说明 ...
- MyBatis实现动态SQL更新
博主记得在一个周五快下班的下午,产品找到我(为什么总感觉周五快下班就来活 ),跟我说有几个业务列表查询需要加上时间条件过滤数据,这个条件可能会变,不保证以后不修改,这个改动涉及到多个列表查询,于是博主 ...
- 面由 AI 生|ZegoAvatar 捏脸技术解析
一.AI"卷"进实时互动 2021年,元宇宙概念席卷全球,国内各大厂加速赛道布局,通过元宇宙为不同的应用场景的相关内容生态进行赋能.针对"身份"."沉 ...
- 无需学习Python,一个公式搞定领导想看的大屏
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 不要让"做不了"成为数字化转型的障碍 随着 ...