【BZOJ4543】Hotel加强版【神仙树形dp】【长链剖分】

题意:给一棵 nnn 个点的树,求两两距离相等的三元组个数。

n≤105n\leq 10^5n105

显然相当于是找一个点到这三个点距离相等。子树内和子树外到当前点的距离为某个值的点的个数可以长链剖分快速得到,但统计答案非常棘手。

接下来是个鬼才想得到的 dp:

f(u,x)f(u,x)f(u,x)uuu 子树内距离 uuu 距离为 xxx 的点的个数,这个比较好求。

g(u,x)g(u,x)g(u,x) 表示假想 uuu 子树外有一个距离为 xxx 的点,在子树内选两个点与这个假想点形成合法三元组的方案数。

鸟语翻译:在 uuu 子树内找两个深度相同的点,若它们到它们的 lca (不一定是 uuu)距离为 ddd ,那么这个 lca 到 uuu 的距离必须是 u−xu-xux,求符合条件的两个点的对数。

也就是我们把这个 ggg 当接口,乘一个子树外为 xxx 的点的个数,就可以直接得到某个范围内的合法三元组个数。

考虑加入一个子树 vvvfff 的转移很显然

f(u,x)⟵f(u,x)+f(v,x−1)f(u,x)\longleftarrow f(u,x)+f(v,x-1)f(u,x)f(u,x)+f(v,x1)

考虑 ggg 的转移

在这里插入图片描述

  • 两个都在 uuu 这边: g(u,x)⟵g(u,x)g(u,x)\longleftarrow g(u,x)g(u,x)g(u,x)
  • 两个都在 vvv 这边: g(u,x)⟵g(v,x+1)g(u,x)\longleftarrow g(v,x+1)g(u,x)g(v,x+1)
  • 一个 uuu 一个 vvv,此时的 lca 一定是 uuu:g(u,x)⟵f(u,x)f(v,x−1)g(u,x)\longleftarrow f(u,x)f(v,x-1)g(u,x)f(u,x)f(v,x1)

综上

g(u,x)⟵g(u,x)+g(v,x+1)+f(u,x)f(v,x−1)g(u,x)\longleftarrow g(u,x)+g(v,x+1)+f(u,x)f(v,x-1)g(u,x)g(u,x)+g(v,x+1)+f(u,x)f(v,x1)

然后在 dp 的时候顺便算答案

ans⟵ans+f(u,x)g(v,x+1)+f(v,x)g(u,x+1)ans\longleftarrow ans+f(u,x)g(v,x+1)+f(v,x)g(u,x+1)ansans+f(u,x)g(v,x+1)+f(v,x)g(u,x+1)

长链剖分优化, fff 往后继承,ggg 往前继承,轻儿子暴力转移。继承的时候 uuu 是空的,只有 f(u,0)g(sonu,1)f(u,0)g(son_u,1)f(u,0)g(sonu,1) 会影响答案,之后对答案的贡献就可以暴力算了。

注意 ggg 要开两倍在中间取指针,前面用来继承后面用来存信息。

复杂度 O(n)\Omicron(n)O(n)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#define MAXN 100005
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
typedef long long ll;
vector<int> e[MAXN];
ll buf[MAXN<<3],*cur=buf;
inline ll* newbuf(int x){ll* p=cur;cur+=x;return p;}
int fa[MAXN],mx[MAXN],son[MAXN];
void dfs(int u,int f)
{fa[u]=f;for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=f){dfs(e[u][i],u);if (mx[e[u][i]]>mx[son[u]]) son[u]=e[u][i];}mx[u]=mx[son[u]]+1;
}
ll *f[MAXN],*g[MAXN];
ll ans;
void dfs(int u)
{*f[u]=1;if (son[u]) f[son[u]]=f[u]+1,g[son[u]]=g[u]-1,dfs(son[u]),ans+=*g[u];;for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=fa[u]&&e[u][i]!=son[u]){int v=e[u][i];f[v]=newbuf(mx[v]),g[v]=newbuf(2*mx[v])+mx[v]-1;dfs(v);for (int j=1;j<=mx[v];j++)ans+=f[u][j-1]*g[v][j];for (int j=0;j<=mx[v]&&j<mx[u];j++)ans+=g[u][j+1]*f[v][j];for (int j=1;j<=mx[v];j++) g[u][j-1]+=g[v][j],g[u][j]+=f[u][j]*f[v][j-1];for (int j=0;j<=mx[v]&&j<mx[u];j++)f[u][j+1]+=f[v][j];}
//	printf("f[%d]:",u);
//	for (int i=0;i<=mx[u];i++) printf("%lld ",f[u][i]);
//	puts("");
//	printf("g[%d]:",u);
//	for (int i=0;i<=mx[u];i++) printf("%lld ",g[u][i]);
//	puts("");
}
int main()
{
//	freopen("test.in","r",stdin);int n=read();for (int i=1;i<n;i++){int u,v;u=read(),v=read();e[u].push_back(v),e[v].push_back(u);	} dfs(1,0),f[1]=newbuf(mx[1]),g[1]=newbuf(2*mx[1])+mx[1]-1,dfs(1);cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于surging 的stage组件设计,谈谈我眼中的微服务

一、前言surging 开源地址&#xff1a;https://github.com/dotnetcore/surging随着业务的发展&#xff0c;并发量的增多&#xff0c;业务的复杂度越来越大&#xff0c;对于系统架构能力要求越来越高&#xff0c;这时候微服务的设计思想应运而生&#xff0c;但是对于微服务需要引…

HDU - 6971 K - I love max and multiply sosdp

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 直接求i&j>ki\And j>ki&j>k不是很好求&#xff0c;所以转换成i&jki\And jki&jk的情况。 考虑对a,ba,ba,b求一遍超集&#xff0c;让后从[0,n−1][0,n-1][0,n−1]扫…

推荐10个技术圈优质的公众号大号

公众号有很多但需要什么只有自己知道本次筛选了一批技术圈优质的公众号&#xff0c;主要与python、人工智能、机器学习、技术人生相关希望对你有所帮助!▼★长按二维码&#xff0c;选择“识别二维码”进行关注。▲长按二维码&#xff0c;识别关注简介&#xff1a;Python爱好者社…

使用Kubeadm创建k8s集群之部署规划(三十一)

前言 上一篇我们讲述了使用Kubectl管理k8s集群&#xff0c;那么接下来&#xff0c;我们将使用kubeadm来启动k8s集群。部署k8s集群存在一定的挑战&#xff0c;尤其是部署高可用的k8s集群更是颇为复杂&#xff08;后续会讲&#xff09;。因此本教程会在部署的过程中穿插讲…

HDU - 6967 G I love data structure 线段树维护矩阵 + 细节

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个长度为nnn的数组a,ba,ba,b&#xff0c;你需要完成如下四种操作&#xff1a; 思路&#xff1a; 思路还是比较简单的&#xff0c;首先建一颗线段树&#xff0c;线段树中维护a,b,a2,b2,aba,b,a^2,b^…

荐读|属性与可直接访问的数据成员之间应该如何选

写在前面在书写C#代码的时候你是否有过这样的经历&#xff1a;经常混用属性以及公有的数据成员。毕竟他们的用法基本一致&#xff0c;对于使用来说好像没什么区别啊。其实我也经常使用类的公有的数据成员来定义一些常量&#xff0c;为了简单&#xff0c;在一些仅仅需要对外暴露…

2021牛客暑期多校训练营3 I Kuriyama Mirai and Exclusive Or 差分 + 二进制分治

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数组aaa&#xff0c;让你实现以下两个操作之后输出数组aaa。 n≤6e5,ai≤230−1n\le6e5,a_i\le2^{30}-1n≤6e5,ai​≤230−1 思路&#xff1a; 下面介绍的思路清奇&#xff0c;反正我想不到。 对…

Lock VS Monitor

介绍介绍对开发人员来说&#xff0c;处理关键代码部分的多线程应用程序是非常重要的。Monitor和lock是c#语言中多线程应用程序中提供线程安全的方法(lock关键字的本质就是对Monitor的封装)。两者都提供了一种机制来确保只有一个线程同时执行代码&#xff0c;以避免代码功能被其…

程序员修神之路--做好分库分表其实很难之二

菜菜哥&#xff0c;上次听你给我讲了分库的情况后&#xff0c;我明白了很多&#xff0c;能再给我讲讲分表吗有收获就好&#xff0c;分表其实有很多情况和分库类似还有不一样的情况吗&#xff1f;有呀&#xff0c;本来数据库和表是不同层面的东西&#xff0c;肯定有差异那你给讲…

2021牛客暑期多校训练营3 B Black and white 最小生成树 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 对于每个数的位置(i,j)(i,j)(i,j)&#xff0c;如果将这个位置染黑&#xff0c;那么我们连一个i−>jni->jni−>jn的边&#xff0c;可以发现我们的操作不影响连通性。如果想要全部染…

关于WinForms的跨显示器DPI自适应

点击上方蓝字关注“汪宇杰博客”导语WinForms 是运行在Windows上的传统.NET桌面应用技术框架。由于历史原因&#xff0c;它对高DPI以及跨不同DPI屏幕的支持有些问题&#xff0c;本文将探索尽可能的解决方案。Windows 的“黑历史”Windows 系统的默认DPI&#xff08;更确切的说法…

.NET开发框架(九)-NLB网络负载平衡配置实战(视频)

&#xff08;NLB配置实战教程-有声视频-第二节&#xff09;请持续关注公众号&#xff0c;第三节&#xff08;NLBARR)正在录制中~第六章IIS负载均衡教程&#xff0c;至今共有37人参与学习尚未学习第六章-IIS负载均衡-视频教程的童靴&#xff0c;赶紧跟上进度&#xff0c;别掉队了…

C#各版本新增加功能

本系列文章主要整理并介绍 C# 各版本的新增功能。C#8.0 于 2019年4月 随 .NET Framework 4.8 与 Visual Studio 2019 一同发布&#xff0c;但是当前处于预览状态。预计在2019年9月正式发布。目前提供以下功能可供试用&#xff1a;Readonly 成员默认接口成员【*重要&#xff0c;…

宣告推出.NET Core 3.0 Preview 7

译&#xff1a;艾心0626今天&#xff0c;我们宣布推出.NET Core 3.0 Preview 7。我们已经从创建新特性阶段过渡到了完善版本阶段。对于接下来的预览版&#xff0c;我们将把重点放在质量(改进)上。在Windows&#xff0c;macOS和Linux上下载.NET Core 3.0 Preview 7。.NET Core 3…

基于Masstransit实现Eventbus的功能

Masstransit 是一个非常优秀的基于消息进行通信的分布式应用程序框架&#xff0c;详情参考官网。在介绍AA.ServiceBus之前&#xff0c;先介绍下几个概念.分布式分布式系统如何定义&#xff1f;这里引用一下Distributed Systems Concepts and Design(Third Edition)中的一句话&a…

微软解释为什么Rust是系统编程的最佳选择

上周&#xff0c;MSRC&#xff08;微软安全响应中心&#xff09;透露出拥抱 Rust 的打算&#xff0c;随后他们将这个话题扩展为一个系列&#xff0c;进一步阐述了使用安全的系统编程语言的的必要性&#xff0c;以及选择 Rust 的原因。在该系列最新一篇文章中&#xff0c;MSRC 团…

你可能不知道的Docker资源限制

本篇内容涉及Docker的内存与CPU限制&#xff0c;可以用于在实际开发中为指定容器设置限制最大使用的资源量&#xff0c;预计阅读时间为5分钟。01—What is 资源限制&#xff1f;默认情况下&#xff0c;容器是没有资源限制的&#xff0c;它会尽可能地使用宿主机能够分配给它的资…

东南亚的IT公司,我劝你善良!

来源公众号&#xff1a;半佛仙人&#xff08;ID&#xff1a;banfoSB&#xff09;“真的救我一条‘狗命’&#xff0c;可以吗&#xff0c;谢谢您了&#xff0c;我真的撑不住了。”5月3日&#xff0c;小巴在朋友圈看到这条信息&#xff0c;附着一张长图&#xff0c;定位&#xff…

小白开学Asp.Net Core 《九》

小白开学Asp.Net Core 《九》 — — 前端篇&#xff08;不务正业&#xff09;在《小白开学Asp.Net Core 三》中使用了X-admin 2.x 和 Layui将管理后端的界面重新布局了&#xff0c;里面简单的介绍了layui table 的使用以及页面table所需的数据做了简单的封装。今天扩展学习下。…

.net持续集成sonarqube篇之sonarqube安装与基本配置

Sonarqube下载与安装Sonarqube下载地址是:https://www.sonarqube.org/downloads/下载版本有两个,一个是长期支持版,另一个是最新版,此处安装的是最新版,目前版本是7.3,下载的时候点击醒目的蓝色按钮即可(此时下载的是社区版),下面有三个无底色按钮下载链接,分别对应的是开发者版…