模拟试题 树(点分治/DSU)

树专题经典题目+方法总结 一、二叉树(Binary Tree) 1.1 二叉树的遍历题目(前序、后序、中序、层次) 后序遍历 = 删除树中结点 当你删除一个节点时,你将首先删除它的左节点和它的右边的节点,然后再删除节点本身。 层次遍历使用 BFS 实现,利用的就是 BFS 一层一层遍历的特性;而前序、中序、后序遍历利用了 DFS 实现。 前中后序遍历的三种方法:递归、迭代、颜色标记法 层次遍历方法:使用 BFS 进行层... 阅读详情

Description

给出一棵树,求出最小的k,满足在树中存在路径P,使得k≥S且k≤E。(k为路径上的边的权值和)

Input

第一行给出N,S,E。N代表树的点数,S,E如题目描述一致。
下面N-1行给出这棵树的相邻两个节点的边及其权值W。

Output

输出共一行一个整数,表示答案。若无解输出-1。

Sample Input

5 10 40 2 4 80 2 3 57 1 2 16 2 5 49

Sample Output

16

Hint

【样例解释】
1到2的路径即为答案。
【数据范围】
对于20%的数据满足n≤300
对于50%的数据满足n≤3000
对于60%的数据满足n≤100000
对于以上数据,满足|E-S|≤50
对于100%的数据满足n≤100000,|E-S|≤1000000

昨天才打了一个dsu今天就忘了= =,这道题点分和dsu都可做。

点分治稍慢,个人感觉点分比较好写。可能是dsu还没打熟。。。

#include<bits/stdc++.h>
using namespace std;
const int Maxn=100005;
struct Edge{
	int cnt,h[Maxn],w[Maxn*2],to[Maxn*2],next[Maxn*2];
	inline void add(int x,int y,int z){
		next[++cnt]=h[x];to[cnt]=y;w[cnt]=z;h[x]=cnt;
	}
}e;
#define to e.to[p]
int siz[Maxn],son[Maxn],dep[Maxn],dist[Maxn];
int prt[Maxn][17];
int ans=1<<30;
set<int>s;
void getson(int x,int fa,int Dep,int Dist){
	siz[x]=1;prt[x][0]=fa;dep[x]=Dep;dist[x]=Dist;
	for(int p=e.h[x];p;p=e.next[p])if(to^fa){
		getson(to,x,Dep+1,Dist+e.w[p]);
		siz[x]+=siz[to];
		if(siz[to]>siz[son[x]])son[x]=to;
	}
}
void ST(int n){
	int maxlog=log2(n);
	for(int j=1;j<=maxlog;++j)
		for(int i=1;i<=n;++i)if(~prt[i][j-1])prt[i][j]=prt[prt[i][j-1]][j-1];
}
int lca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	for(int i=log2(dep[x]);i>=0;--i)
		if(dep[x]-(1<<i)>=dep[y])x=prt[x][i];
	if(x==y)return y;
	for(int i=log2(dep[x]);i>=0;--i)
		if(prt[x][i]^prt[y][i])x=prt[x][i],y=prt[y][i];
	return prt[x][0];
}
int getdist(int x,int y){
	int Lca=lca(x,y);
	return dist[x]+dist[y]-2*dist[Lca];
}
void statistics(int x,int lca,int S,int E){
	set<int>::iterator it=s.lower_bound(S+2*dist[lca]-dist[x]);
	if(it!=s.end())ans=min(ans,*it+dist[x]-2*dist[lca]);
}
void update(int x,int lca,int S,int E,int cmd){
	cmd?s.insert(dist[x]),void():statistics(x,lca,S,E);
	for(int p=e.h[x];p;p=e.next[p])
		if(to^prt[x][0])update(to,lca,S,E,cmd);
}
void dsu(int x,int S,int E){
	for(int p=e.h[x];p;p=e.next[p])
		if((to^prt[x][0])&&(to^son[x]))dsu(to,S,E),s.clear();
	if(son[x])dsu(son[x],S,E);
	for(int p=e.h[x];p;p=e.next[p])if((to^prt[x][0])&&(to^son[x])){
		update(to,x,S,E,0);update(to,x,S,E,1);
	}
	statistics(x,x,S,E);
	s.insert(dist[x]);
}
int main(){
	int n,S,E;scanf("%d%d%d",&n,&S,&E);
	for(int i=1;i<n;++i){
		int x,y,z;scanf("%d%d%d",&x,&y,&z);
		e.add(x,y,z),e.add(y,x,z);
	}
	memset(prt,-1,sizeof(prt));
	getson(1,0,0,0);
	ST(n);
	dsu(1,S,E);
	printf("%d\n",ans<=E?ans:-1);
	return 0;
}

 

#include<bits/stdc++.h>
using namespace std;
const int Maxn=100005;
struct Edge{
	int cnt,h[Maxn],w[Maxn*2],to[Maxn*2],next[Maxn*2];
	inline void add(int x,int y,int z){
		next[++cnt]=h[x];to[cnt]=y;w[cnt]=z;h[x]=cnt;
	}
}e;
struct cmp{
	bool operator () (const int&A,const int &b) const {
		return A<b;
	}
};set<int,cmp>ss;
int top,s[Maxn];
#define to e.to[p]
int tmpsiz[Maxn];
bool vst[Maxn];
int ans=1<<30;
inline void stat(int x,int fa,int dist){
	s[++top]=dist;
	for(int p=e.h[x];p;p=e.next[p])
		if(!vst[to]&&(to^fa))stat(to,x,dist+e.w[p]);
}
inline void work(int x,int S,int E){
	ss.clear();
	for(int p=e.h[x];p;p=e.next[p])if(!vst[to]){
		top=0;stat(to,x,e.w[p]);
		for(int i=1;i<=top;++i){
			int p=*ss.lower_bound(S-s[i]);
			if(ss.count(p)&&S<=p+s[i]&&p+s[i]<=E)ans=min(ans,p+s[i]);
		}
		for(int i=1;i<=top;++i)ss.insert(s[i]);
	}
	int p=*ss.lower_bound(S);
	if(ss.count(p)&&S<=p&&p<=E)ans=min(ans,p);
}
inline void getroot(int x,int fa,int &mn,int &root,int totsiz){
	tmpsiz[x]=1;int maxsiz=0;
	for(int p=e.h[x];p;p=e.next[p])if(!vst[to]&&(to^fa)){
		getroot(to,x,mn,root,totsiz);
		tmpsiz[x]+=tmpsiz[to];
		maxsiz=max(maxsiz,tmpsiz[to]);
	}
	maxsiz=max(maxsiz,totsiz-tmpsiz[x]);
	if(maxsiz<mn)mn=maxsiz,root=x;
}
inline void Divide(int x,int S,int E,int totsiz){
	int mn=1<<30,root=x;
	getroot(x,0,mn,root,totsiz);
	work(root,S,E);
	vst[root]=1;
	for(int p=e.h[root];p;p=e.next[p])
		if(!vst[to])Divide(to,S,E,tmpsiz[to]);
}
int main(){
	int n,S,E;scanf("%d%d%d",&n,&S,&E);
	for(int i=1;i<n;++i){
		int x,y,z;scanf("%d%d%d",&x,&y,&z);
		e.add(x,y,z),e.add(y,x,z);
	}
//	work(2,S,E);
	Divide(1,S,E,n);
	printf("%d\n",ans==1<<30?-1:ans);
	return 0;
}

 

Rockchip RK3588开发板调试:如何用ddrbin_tool修改Loader阶段的串口打印(UART2_M1配置) 本文详细介绍了如何在Rockchip RK3588开发板上使用ddrbin_tool工具修改Loader阶段的串口打印配置(UART2_M1),帮助开发者获取早期启动阶段的调试信息。通过实战步骤解析和高级调试技巧,解决嵌入式系统开发中的黑箱问题,提升硬件调试效率。 阅读详情

相关推荐

(遇到问题)(已解决)word敲入的公式转化为mathtype

https://www.mathtype.cn/wenti/wordgongshi-zhuanhuan.html 现在越来越多的人在文档中编辑公式的时候会选择MathType来编辑,因为它包含有众多的数学符号和模板,编辑公式时非常方便。但是也有一些人在编辑公式时没有使用MathType公式编辑器,直接使用Word中自带的公式编辑器来编辑的。当我们需要要共享一份文件的时候,这种用自带公式编辑器编辑出来的文件,在我们安装有MathType公式编辑器的电脑里打开时,双击公式没有反应,是无法对它们进行修改的.

计算机视觉 1万+

点分治&&DSU on tree学习笔记

点分治 luoguの模板 题目描述 给定一棵有 nnn 个点的树,询问树上距离为 kkk 的点对是否存在。 思路 递归处理每一个子树,容斥消除重复的答案,复杂度取决于递归的深度。 考虑每次选子树重心作为根,复杂度O(nm log n)O(nm \ log \ n)O(nm log n) 代码 #include<bits/stdc++.h> #define ll long long #define N 10005 #define W 10000005 #de

qq_44062973的博客 339

立创开源桌面激光雕刻机DIY全解析:从悬臂结构、Arduino主控到Marlin固件

本文详细解析了基于立创开源平台的桌面激光雕刻机DIY全过程。重点介绍了悬臂式机械结构的设计与优化,阐述了采用Arduino Mega 2560主控与RAMPS 1.4扩展板的经典控制方案,并深入讲解了Marlin固件的关键配置步骤,包括电机步数计算与激光功能启用,为创客和电子爱好者提供了一套完整的从硬件搭建到软件调试的实战指南。

weixin_42510201的博客 382

JZOJ.4715【NOIP2016提高A组模拟8.19】树上路径

点分治

Luckfort 662

基于图神经网络的社交网络虚假账号检测系统 (Graph-based Fake Account Detection System, GFADS)

FOLLOWSRETWEETSSHAREDCOMMENTSLIKESMENTIONSUseruser_idusernamejoin_datebioavatar_urllocationverifiedis_fakeLOAD CSV这是决定模型性能的关键环节,需结合和。XXedge_indexy新账号缺乏历史数据和丰富关系。全网图可能包含数亿节点和数十亿边,难以直接训练。社交网络是动态变化的,虚假账号策略也在不断进化。获取大规模、高质量的真实/虚假账号标注数据非常困难。

Deng945201314的博客 1481

elasticsearch-6.5.4集群部署(图文详细)及常见错误

目录 服务器规划 部署包下载 服务器初始化(所有节点都要操作) 内核参数修改 /etc/security/limits.conf修改 /etc/sysctl.conf文件修改 禁用selinux 关闭防火墙 创建es用户 安装jdk es部署 单节点(节点1)部署 部署包上传解压 配置文件修改 修改文件属组 部署包分发 单节点(节点2)部署 配置文件修改 修改文件属组 单节点(节点3)部署 配置文件修改 修改文件属组 启动ES集群 验证 单节点验证 查看集

夜灬狼丶 1977

NOIP模拟赛2 B题 (点分治)

题目描述:给出一棵树,求出最小的kkk,使得,且在树中存在路径PPP,使得k≥Sk ≥ Sk≥S 且k≤Ek ≤ Ek≤E. (kkk为路径PPP上的边的权值和) 很显然的点分治的题目。 按照点分治的套路, 1.1.1.先对这棵树进行重心划分 2.2.2.统计过重心的点的路径 3.3.3.递归求解 在统计路径的时候,排序后枚举加lowerboundlowerboundlowerbound,同时为避免统计到同一子树的(以当前划分的重心为根),可以每次统计一颗子树内的路径长度,就与已遍历子树进行答案统计,时间复

Soap__的博客 258

Pixhawk变砖自救指南:从DFU模式到固件重刷全流程(附2.4.8实测)

本文详细介绍了Pixhawk飞控变砖后的自救方法,从DFU模式进入、固件重刷到高级恢复技巧全流程。特别针对国产版本boot0引脚未引出的特殊情况提供了解决方案,帮助用户通过QGC或Mission Planner地面站工具恢复飞控功能,适用于2.4.8等常见固件版本。

weixin_29168813的博客 337

【JZOJ4715】树上路径

Description给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E。(k为路径p上的边的权值和)

sadnohappy 953

camera QXXX架构

This article introduces the QCX camera architecture for Qualcomm’s latest automotive chips including SA8650. It elaborates the layered camera stack under QNX, HGY and HQX systems, covering client applications, stream manager, CamX components and hardware d

qq_39257814的博客 4544

2023华为OD机试真题B卷 Python 实现【最长的元音子串长度】

定义当一个字符串只有元音字母(a,e,i,o,u,A,E,I,O,U)组成,称为元音字符串,现给定一个字符串,请找出其中最长的元音字符串,并返回其长度,如果找不到请返回0, 字符串中任意一个连续字符组成的子序列称为该字符串的子串

MISAYAONE的博客 900

【JZOJ 4715】树上路径

Description 给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E。(k为路径p上的边的权值和) Solution 很显然的点分治嘛, 为了防止选的点在同一棵子树中,我们再维护一个数组表示当前位置往后的第一个和我不在一块子树的点的位置, 我们先象标准点分治一样维护两个指针i,j,在维护完j以后,判断当前的j是否和i在一颗子树中,是就跳到往后第一个不是的,再算答案, 复

879

OGRE 3D----2. QGRE + QQuickView

将 OGRE(面向对象图形渲染引擎)集成到使用 QQuickView 的 Qt Quick 应用程序中,可以在现代灵活的 UI 框架中提供强大的 3D 渲染功能。本文将指导您如何在 QQuickView 环境中设置 OGRE。

charce_you的专栏 913

并查集 (DSU)

学习链接

cosx_的博客 745

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

题目链接:https://www.luogu.org/problemnew/show/P3806 题目大意:中文题目 具体思路:直接dfs好像会超时,然后我们就开始想优化的方法,然后就是一个CDQ入门题了,我们可以分解成许多子问题进行解决,然后对于一棵树的话,我们最好的切入点就是这棵树的重心了,这样就能使得复杂度尽可能的低了,然后就不停的往下递归找每一棵子树的重心进行求解就可以了,然...

diaomeijiao3430的博客 178

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

P4149 [IOI2011] 点分治 / dsu on tree

题意 传送门 P4149 [IOI2011]Race 题解 点分治 以 ppp 为根节点的树上路径可分为两类:经过 ppp 的路径;不经过 ppp 的路径。那么可以在处理 ppp 时处理第一类路径,再递归子树处理第二类路径。 路径权值和 kkk 范围较小,使用桶 mnmnmn 记录节点至根节点的路径中权值和为 [0,k][0,k][0,k] 的最小深度(路径数),依次遍历子树,以 DFSDFSDFS 时间戳为索引记录子树上节点至根节点的深度 depdepdep 与距离 dsdsds,并进行可行性与最优性剪枝

neweryyy的博客 261

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Codeforces Round #169 (Div. 2) E. Little Girl and Problem on Trees(给出一棵树,对距离某个点d范围之内的所有点+x,查询某个点的值)

E. Little Girl and Problem on Trees time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output A little girl loves pro

_zidaoziyan的博客 1622

Dsu on tree 神奇的暴力

什么是dsu这是一个很暴力很无脑的算法。 对于一棵树如果我们需要计算每个节点对应子树的信息。 由于每个父节点的信息来自每个子节点。我们来用以下的流程来合并信息。 为什么可以用dsu显然对于一个节点它只会被合并(lognlog_n)次所以复杂度可以为n∗(logn)n*(log_n) 例如我们要:统计子树内出现次数不少于k的元素个数。void dfs_pre(int x,int f){

倘若天下着雨。。。你还在 3013

【JZOJ 4715】 树上路径

Description给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E。(k为路径p上的边的权值和) 对于100%的数据满足n<=10^5,|E-S|<=10^6 对于所有数据满足1<=Wi<=1000,|E|,|S|<=10^9Analysis经典的点分治。 具体方法就像树中点对距离一样,记录到重心的距离与所属的子树。 按到重心的距离排序。 一个指针往右扫,二分

LYD729 652

【NOIP提高】树上路径

Description给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E。(k为路径p上的边的权值和)Solution这个一眼的树分治啊! 但是标了NOIP的题不敢打树分治,结果TAT。 其实打了个不确定的方法,但是在不是菊花图的情况下跑的很快。 每次对每个点每个儿子的子树与这个点的距离放进一个数组里,然后数组两两合并,并同时求答案。 比如把一个儿子节点的所有值放进了

Facico的博客 1139

【NOIP2016提高A组模拟8.19】(雅礼联考day2)树上路径

给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E。(k为路径p上的边的权值和)。分析点分治,设当前为x的,求在以x为根的子树中,经过x的路径(包括起点或终点在x)中长度大于等于S的最小值。 假设i有3个儿子,j、k、l, 首先将以j为根的子树中的所有点到x的距离求出来,放进队列中。排个序。 接着将以k为根的子树中的所有点到x的距离求出来,一个一个点枚举,在队列中二

chen1352 932

dsu+树链剖分+树分治

dsu,对于无修改子树信息查询,并且操作支持undo的问题 暴力dfs,对于每个节点,对所有轻儿子dfs下去,然后再消除轻儿子的影响 dfs重儿子,然后dfs暴力恢复轻儿子们的影响,再把当前节点影响算进去 就有了整棵子树的信息了,时间复杂度O(nlogn) 经典例题:http://codeforces.com/contest/600/problem/E 1 #include &...

weixin_34066347的博客 345

Jzoj4715 树上路径

给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E。(k为路径p上的边的权值和) 这是一道点分治的题目,不过做法多样,也可以用启发式合并水过去,好像还有一种方法是什么二分 如果直接点分治的话,我们将子树内所有的点排序,求出其所处的子树编号belong,再求出next数组,next[i]=j表示belong[i]!=b...

dianning8393的博客 222

hdoj 4607 Park Visit 【树的直径的应用 求一棵树中经过k个点需要走的最短距离】

Park Visit Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2754    Accepted Submission(s): 1249 Problem Description Claire and her

世界很大 1043

【NOIP2016提高A组模拟8.19】树上路径

Description给出一棵树,求出最小的k,使得,且在树中存在路径p,使得k>=S且k<=E。(k为路径p上的边的权值和)Input第一行给出N,S,E。N代表树的点数,S,E如题目描述。 下面N-1行给出这棵树的相邻两个节点的边及其权值W。Output输出共一行一个整数,表示答案。若无解输出-1。Sample Input5 10 40 2 4 80 2 3 57 1 2 16 2 5

Jacky35 844

【codeforces 274B】【树形DP】 B. Zero Tree【一棵树,每个点有权值,每次操作可以对一个联通子集中的点全部加或者减1,且每次操作必须包含点1,问最少多少次操作权值全为0】

传送门:B. Zero Tree 描述: B. Zero Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output A tree is a graph w

魔笛手的博客 1656
上一篇: DSU——树上的文艺的暴力
下一篇: 洛谷P3588 线段树优化建图
DancingZ
博客等级 码龄9年 10粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值