NOIp训练 [SCOI2018]Tree(链分治)

这篇博客介绍了一种处理带点权树的方法,主要针对SCOI2018中的一道题目。文章讨论了如何利用链分治来解决询问路径点权值之和最大值的问题,以及如何进行点的权值修改操作。作者提到了可以使用点分树或LCT(轻重链剖分)解决,但推荐使用链分治,因为它相对简单。在链分治的实现中,通过可删堆维护子树信息,线段树维护重链信息,避免查询时重复访问节点。
摘要由CSDN通过智能技术生成

传送门
题意:
给一棵带点权的树,要求支持如下操作:

  1. 询问从 U 出发的简单路径,经过的点权值之和的最大值
  2. 将 U 的权值修改为 V

空间限制64MB


思路:
你可以使用一种叫做点分树的无脑方法,然后用 s h o r t + c h a r short+char short+char 3 4 \frac34 43 i n t int int可以通过这一道题。 毕竟毒瘤出题人卡了空间
你显然也可以上 l c t lct lct搞。博主懒癌晚期不想写/想了
实在不行的就学博主大力链分治吧。
这跟那个 Q T R E E QTREE QTREE系列是一个套路,对于每条链用可删堆维护子树的信息,用线段树维护重链的信息,然后每次像上面跳即可。
注意这个时候查最大值直接跳可能会走到重复的点,因此查询的时候要先消除当前节点所在子树的影响才行。
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long long ll;
inline int read(){
   
	int ans=0;
	bool f=1;
	char ch=getchar();
	while(!isdigit(ch))f^=ch=='-',ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return f?ans:-ans;
}
typedef long long ll;
const int N=1e5+5,inf=0x3f3f3f3f;
int n,pred[N],num[N],tot=0,m,a[N],dep[N],top[N],fa[N],hson[N],siz[N],bot[N];
vector<int>e[N];
void dfs1(int p){
   
	siz[p]=1;
	for(ri i=0,v;i<e[p].size();++i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值