片 - 树上问题 - 1

news/2024/11/18 3:28:24/文章来源:https://www.cnblogs.com/MilkingAnAloe/p/18349972

欢迎来看 “片” (的简介)

由于-\(看片\)-生涯转瞬即逝,于是我选择对“\(片\)”进行一定的总结:

相信你一定看懂了

由于开始的时间有一点晚,就姑且认为我以后会慢慢补充吧......

回到总部

点分治 \(P4178\) \(Tree\)

解: 树的重心,树上\(DFS\)搜索,点分治

经过(两)天 (一) 夜的鏖战,总算 \(\mathcal{TM}\) 的是把这个历史遗留问题解决了:

\(——点分治——\)

其实还有边分治

有挺多道题的,主要分享两道模板,废话,但只细讲一道

先从上面那道题开始。

暴力的想法就是往下找嘛吗,小小的加一个树上差分,估摸一下应该有个 \(\mathcal{O}(n^3)\)卡卡不就过了,继续思考,看看题解,有一个初步的想法,一棵树,能长成个什么样子嘛,初步设想一个小 \(\text{DP}\)

假设我们以 \(1\) 为根,那么它一名伸出来的两点距离要么在其子树中,要么或这直接由 \(1\) 引申出来,要么跨过 \(1\),显然第二种讨论可以自己消化掉,即跨过 \(1\) 的情况由两个由 \(1\) 引申出来的情况来消化,若从这里开始思考,还会有一些问题,比如设有 \(u\), \(v\)两个点的 \(\text{LCA}\) 不等于 \(1\) 那显然这个时候有多余的情况,怎么办?很简单,在往下递归的过程中记录这个子树的答案,然后在 \(1\) 的答案里扣就可以了。

那么接下来考虑处理答案,首先将所有的权值进行排序,然后双指针秒了。

想一想排序 \(\mathcal{O}(nlogn)\),再加一个根估计得有个 \(\mathcal{O}(n^2logn)\),这基本就没什么用,排序等方面先不管,考虑这个根能不能进行一系列的优化,模式化的,就出现了重心,一个最大的子树大小一定不超过过 \(\frac{sz}{2}\) 的抽象,这个时候,题解就会告诉你:

时间复杂的优化到了 \(\mathcal{O}(nlog^2n)\)

接下来的东西只针对于还是个 \(\mathcal{SB}\) 的我:
why????
你肯定觉得每一个东西都会作为根,拼什么就优化了呢,实际上,这时从最开始就没有理解的表现,所谓的 \(nlogn\), 实际是对于每一个子树的排序,就比如建一个有根树,我们排序所针对的并不是正一棵树,而是他的子节点。

例如红就会排绿和蓝,绿就会排蓝,所以实际上所谓的 \(\mathcal{O}(n^2logn)\) 是一个及其保守党的估计,事实上最接近他的情况也只不过是当出现一整条链往下排的情况,然而再怎么保守,也会被可爱可敬的出题人发现,因此就有了这个神仙的优化:

重心

直接点说就是 \(n^2logn\) 的其中一个 \(n\) 代表的就是深度之类的东西。

由于加了重心之后最大的子树都只会有不到一半的大小那么这样递归下去,每一次大小都少一半,那么等到这棵树被我榨干了的时候就只需要 \(logn\) 次,所以这个时间复杂度是 \(\mathcal{O}(nlog^2n)\)

嘿嘿嘿,就好了,注意每一层都要找重心哦。

然后就是实践,由于妈妈在催着睡觉,我就先直接放代码了

点击查看代码
#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
#define endl '\n'
using namespace std;
const int MAXN=4e4+5;
ll n,Q;
struct edge{ll to,nxt,val;
};
edge e[MAXN<<1];
ll head[MAXN],tot=0;
void add_edge(ll u,ll v,ll w){++tot;e[tot].to=v;e[tot].nxt=head[u];head[u]=tot;e[tot].val=w;
}
bool vis[MAXN];
ll sz[MAXN],wt[MAXN],rt=0,Tsz;
void GetRt(ll u,ll fath){//求重心,而且是每一棵子树sz[u]=1;wt[u]=0;for (int i=head[u];i;i=e[i].nxt){ll v=e[i].to;if (v==fath || vis[v]) continue;GetRt(v,u);sz[u]+=sz[v];wt[u]=max(wt[u],sz[v]);}wt[u]=max(wt[u],Tsz-sz[u]);if (wt[u]<wt[rt]) rt=u;
}
ll dis[MAXN];
void Getval(ll u,ll fath,ll vl){//寻找权值dis[++dis[0]]=vl;for (int i=head[u];i;i=e[i].nxt){ll v=e[i].to;if (v==fath || vis[v]) continue;Getval(v,u,vl+e[i].val);}
}
ll m;
ll GetAns(ll u,ll vl){dis[0]=0;Getval(u,0,vl);sort(dis+1,dis+dis[0]+1);ll curans=0;for (int l=1,r=dis[0];r>=1 && l<=r;r--){while (dis[l]+dis[r]<=m && l<=r) curans+=r-l,++l;}return curans;
}
ll ans=0;
void dfs(ll u){vis[u]=1;ans+=GetAns(u,0);for (int i=head[u];i;i=e[i].nxt){ll v=e[i].to;if (vis[v]) continue;ans-=GetAns(v,e[i].val);Tsz=sz[v];wt[rt=0]=1145141919810ll;GetRt(v,0);dfs(rt);}
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);memset(vis,0,sizeof(vis));cin>>n;for (int i=1;i<n;i++){ll u,v,w;cin>>u>>v>>w;add_edge(u,v,w);add_edge(v,u,w);}Tsz=n;wt[rt=0]=1145141919810ll;GetRt(1,0);cin>>m;dfs(rt);cout<<ans<<endl;
}

详细解说就算了,毕竟都是自己的代码,肯定是看得懂的,小小阐述一下,大致就是几个部分,找重心,在树上正常递归,以及算答案。

重心不用多赘述了。

树上的递归与算答案紧密相连,先是算一下 \(u\) 自己本身的答案,这个时候的答案就是前面说的那个含有子节点路径重叠的点的贡献的答案,由 \(u\) 算到每一个 \(v\) 的时候,算一下 \(v\) 的答案,并在最终答案中减去,这个部分就是去掉非法贡献,注意这个过程中只是一次普通的递归,不要想多了,然后在当前的子树中找到对应的重心,再以重心继续跑。

这样,你就学会了 点分治

\(P3806\) \(【模板】\) \(点分治\) \(1\)

解:
唯一的区别就是这一次改成确切地询问了,那么双指针就没有必要了,直接记录求值即可,具体就自己看代码吧。

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

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

相关文章

jwt伪造身份组组组合拳艰难通关

现在的攻防演练不再像以往那样一个漏洞直捣黄龙,而是需要各种组合拳才能信手拈来,但是有时候使尽浑身解数也不能称心如意。前言 现在的攻防演练不再像以往那样一个漏洞直捣黄龙,而是需要各种组合拳才能信手拈来,但是有时候使尽浑身解数也不能称心如意。 前期信息收集 首先是…

Genomics | 转录组和代谢组分析揭示了铁皮石斛中黄酮类化合物的积累

铁皮石斛是一种在中国有着悠久使用历史的中草药。黄酮是铁皮石斛重要的次生代谢产物,但其在铁皮石斛中的分子调控机制尚不清楚。在这项研究中,作者收集了一年到四年生的铁皮石斛茎,用于rna测序和质谱数据收集。结果表明,代谢组学分析检测到124种不同的类黄酮代谢物,其中黄…

包机制

1.包机制2.正确建立包 先找到Tree Appearance中找到compact middle package,取消勾选。然后右键src 新建一个package 一般利用公司域名倒置作为包名 如:com.zhiShi.www3.导包 使用import可以指定包中的某个成员如果文件太多,可以选择* *是选择所有文件

获取窗口大小 极语言

程序段 窗体启动 整数 width,height; 矩形类 矩形; 取客户区(窗体, &矩形); width = 矩形.宽-矩形.左; height =矩形.高-矩形.顶; 文本 x[5]=width; 文本 y[5]=height; 信息框(0,x,"你好",信息图标); 信息框(0,y,"你好",信息图标); 结束看下图,注意我截…

WPF实现一个壁纸切换器

这是一个最初的版本,大概效果如下: 写这个工具的想法是方便切换两套壁纸,一套私密壁纸,一套日常壁纸。准备支持动态壁纸、Bing每日图、从WebApi接口随机获取一张图。 技术层面 来说,没有问题,只是缺少时间去实现。项目代码:https://github.com/zhaotianff/PrivateWallp…

BMC Genomics | 综合代谢组学和转录组学分析揭示了菊花黄酮和咖啡酰奎宁酸的生物合成机制

杭白菊是一种流行的药用和食用植物,主要通过黄酮类和咖啡酰奎宁酸(CQAs)的存在发挥其生物活性。然而,菊花头状花序中黄酮和CQA生物合成的调控机制尚不清楚。 本研究采用高效液相色谱法测定了菊花头状花序发育过程中黄酮类化合物和CQAs的含量,发现在S1和S2阶段含量较高,在S3…

Creo二次开发(一)

creo vs环境搭建 note:配置Debug,release会失败 1.安装creo要安装ptoolkit 2.vs配置 包含目录 库目录 预处理定义PRO_USE_VAR_ARGS 链接器 wsock32.lib psapi.lib netapi32.lib mpr.lib protk_dllmd_NU.lib ucore.lib udata.lib note:忽略特定默认库库中添加“msvcrt.lib(结合…

【Playwright+Python】系列教程(八)鉴权Authentication的使用

写在前面 还是有些絮叨的感觉,官方翻译和某些博主写那个玩楞,基本都是软件直接翻译后的产物。 读起来生硬不说,甚至有的时候不到是什么意思,真的是实在不敢恭维。 到底是什么意思? 就是你已经登陆过一次,在Session、Cookie未失效的情况下,登录过一次后,下次就不用再走一…

Charles使用教程

一、Charles教程(一)Charles使用教程Charles是一个HTTP代理/ HTTP监视器/反向代理,能够查看其机器和Internet之间的所有HTTP和SSL / HTTPS流量。这包括请求,响应和HTTP标头(包含cookie和缓存信息) Charles 是在 Mac /Windows下常用的网络封包截取工具,在做 移动开发时,…

maven引用库显示红色波浪线时尝试删除_remote.repositories有用

使用第三方框架平台开发,其仓库为私服,在私服仓库不可用时但jar又是已经存在的情况下,maven很多引用库一直显示红色红波浪。 最后通过将repository下所有包下的_remote.repositories文件删除,问题解决了。 即,使用本地的jar,不需要检查远程仓库上的包。

Odoo17.0基于企业微信的考勤应用

对于使用企业微信进行办公的企业而言,使用企业微信打卡功能进行考勤非常常见,而如果能够将企业微信的打卡记录同步到odoo将极大的方便公司进行考勤统计和薪酬核算,降低人事工作的琐碎度,提供企业内部运营效率。本文就将展示如何借助企业微信高级版模块实现企业微信考勤应用…

StringBuffer作为参数传递

package com.shujia.day11;public class stringBufferDemo1 {public static void main(String[] args) {String s1 = "hello";//StringBuffer作为参数传递StringBuffer sb1 = new StringBuffer("hello");StringBuffer sb2 = new StringBuffer("world&…