[点分树][二分] [BZOJ4317]Atm的树 && [BZOJ2117][2010国家集训队]Crash的旅游计划 &&[BZOJ2051]A Problem For Fun

点分树/动态点分治 前言 点分治是一种树上分治算法,常用于处理和路径相关的统计,或者是树上满足某种条件的点对数量。 在点分治的基础上,构造一棵支持修改的树,就成了点分树。 算法理解 点分治的核心是按照重心来划分连通块,我们在递归的时候,将上一层的重心作为这一层的重心的父亲,就成了点分树。容易知道,这棵树的树高是 O(logn)O(logn)O(logn) 的,因为总共只会有 O(logn)O(logn)O(logn) 层。下面盗用 辰星凌大佬的图 来看看点分树长什么样子。 如图,上面是原树,下面是点分树。可以看到,点分树和原 阅读详情
题意

求一棵树上,以每个点为起点的第k短路径


双倍经验三倍经验啊

对于每一个点,二分答案,那么只要判断与当前点距离小于等于二分出来的答案的点的个数是否等于k就行了

复杂度nlog^3n,数据点应该不多……

表示树上倍增常数太大了……

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <ctime>
#define N 100010

using namespace std;

int n,k,u,v,w,cnt,root,Max,isize,cnt0,Root;
int G[N],vis[N],iG[N],fa[N],dpt[N],far[N],disr[N];
int p[N][20],Dis[N][20];
struct edge{
    int t,nx,w;
}E[N<<1];
struct stp{
    int a,b,c;
    stp(int _a=0,int _b=0,int _c=0):a(_a),b(_b),c(_c){}
};
struct EDGE{
    int t,nx;
}e[N<<2];
vector<int> dist[N],rec[N];
queue<stp> Q;

inline char nc(){
  static char buf[100000],*p1=buf,*p2=buf;
  return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}

inline void reaD(int &x){
    char c=nc(); x=0;
    for(;c>57||c<48;c=nc());for(;c>=48&&c<=57;x=x*10+c-48,c=nc());
}

inline void Insert(int x,int y,int z){
    E[++cnt].t=y; E[cnt].nx=G[x]; E[cnt].w=z; G[x]=cnt;
    E[++cnt].t=x; E[cnt].nx=G[y]; E[cnt].w=z; G[y]=cnt;
}

inline void Insert(int x,int y){
    e[++cnt].t=y; e[cnt].nx=iG[x]; iG[x]=cnt;
}

int checking(int x,int f){
    int size=1;
    for(int i=G[x];i;i=E[i].nx)
        if(E[i].t!=f&&!vis[E[i].t]) size+=checking(E[i].t,x);
    return size;
}

int explore(int x,int f){
    int Size=1,iMax=0;
    for(int i=G[x];i;i=E[i].nx)
        if(E[i].t!=f&&!vis[E[i].t]){
            int k=explore(E[i].t,x);
            if(k>iMax) iMax=k;
            Size+=k;
        }
    if(isize-Size>iMax) iMax=isize-Size;
    if(iMax<Max) Max=iMax,root=x;
    return Size;
}

void calc(int x,vector<int> &A,int f,int d){
    A.push_back(d);
    for(int i=G[x];i;i=E[i].nx)
        if(E[i].t!=f&&!vis[E[i].t]) calc(E[i].t,A,x,d+E[i].w);
}

inline int LCA(int x,int y){
    if(dpt[x]<dpt[y]) return LCA(y,x);
    for(int i=17;~i;i--)
        if(dpt[p[x][i]]>=dpt[y]) x=p[x][i];
    if(x==y) return x;
    for(int i=17;~i;i--)
        if(p[x][i]!=p[y][i]) x=p[x][i],y=p[y][i];
    return p[x][0];
}

inline int dis(int x,int y){
    return disr[x]+disr[y]-2*disr[LCA(x,y)];
}

void divide(int x,int par,int frm){
    isize=checking(x,0);
    Max=1<<30; explore(x,0); int iroot=root;
    if(par) Insert(par,root),fa[root]=par,far[root]=dis(root,par),calc(E[frm].t,rec[root],0,E[frm].w);
    else Root=root;
    vis[root]=1;
    calc(root,dist[root],0,0);
    for(int i=G[iroot];i;i=E[i].nx)
        if(!vis[E[i].t]) divide(E[i].t,iroot,i);
}

inline int find(vector<int> &A,int b){
    return upper_bound(A.begin(),A.end(),b)-A.begin();
}

int query(int x,int d){
    int r=find(dist[x],d)-1,L=0;
    for(int i=x,j=1;fa[i];i=fa[i],j++){
        int k=Dis[x][j];
        if(d-k>=0) r+=find(dist[fa[i]],d-k);
        if(d-k>=0) r-=find(rec[i],d-k);
    }
    return r;
}

void dfs(int x,int f){
    for(int i=1;i<=17;i++) p[x][i]=p[p[x][i-1]][i-1];
    for(int i=G[x];i;i=E[i].nx)
        if(E[i].t!=f){
            p[E[i].t][0]=x;
            dpt[E[i].t]=dpt[x]+1;
            disr[E[i].t]=disr[x]+E[i].w;
            dfs(E[i].t,x);
        }
}

int main(){
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    reaD(n); reaD(k);
    for(int i=1;i<n;i++)
        reaD(u),reaD(v),reaD(w),Insert(u,v,w);
    cnt=0; dfs(1,0); 
    divide(1,0,0);
    for(int i=1;i<=n;i++){
        int x=fa[i],j=1;
        while(x){
            Dis[i][j]=dis(x,i);
            j++; x=fa[x];
        }
    }
    for(int i=1;i<=n;i++)
        sort(dist[i].begin(),dist[i].end()),sort(rec[i].begin(),rec[i].end());
    for(int i=1;i<=n;i++){
        int L=1,R=1<<30,mid;
        while(L<R)
            query(i,mid=L+R>>1)>=k?R=mid:L=mid+1;
        printf("%d\n",R);
    }
}
GLM-5.2大模型本地部署与量化技术详解 大语言模型(LLM)的本地部署是当前AI领域的重要技术方向,其核心挑战在于如何平衡模型规模与计算资源。通过混合专家(MoE)架构和动态量化技术,可以显著降低模型推理时的计算开销。GLM-5.2作为拥有7440亿参数的巨型模型,采用IndexShare技术创新实现了跨层注意力索引共享,配合Dynamic 2.0量化技术将模型体积压缩86%。这些技术突破使得在个人设备上部署千亿参数模型成为可能,为代码生成、知识管理等应用场景提供了新的可能性。特别是2-bit量化版本在保持82%精度的同时将模型压缩到239GB, 阅读详情

相关推荐

分治算法在树的路径问题中的应用

分治算法在树的路径问题中的应用 点分治 树分治

【BZOJ4317】Atm的树

【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include&lt;bits/stdc++.h&gt; using namespace std; #define MAXN 100005 template &lt;typename T&gt; void read(T &amp;x) { x = 0; int f = 1; char c = getchar(); for (; ...

cz_xuyixuan的博客 395

用ADS复现一篇MTT顶刊的GAN功率放大器:从理论推导到版图仿真的完整避坑指南

本文详细解析了如何利用ADS软件复现MTT顶刊中的E/F3类GaN功率放大器设计,从理论推导到版图仿真的全流程。通过核心设计理念解析、ADS环境配置、输出匹配网络优化等关键步骤,提供了一套完整的工程实践指南,帮助工程师跨越学术理论与实际应用的鸿沟,实现高效率射频功率放大器的设计。

weixin_30654583的博客 315

点分树——动态点分治

前置芝士:树上点分治 进入正题 啥是点分树? 顾名思义,它和点分治密切相关,实际上,点分树就是将点分治时的重心相连,所构成的一棵树。 举个栗子,比如说有这么一棵树: 那么它的点分树就是这样的: 因为有时候某些树的重心不唯一,所以点分树的形态也各异,但这都不影响对他的使用。 点分树の用处 引子 看下面这道题: 给一棵n个点的树,所有边的权都为1,问图中距离为k的点对数量 简单~,点分治模板题...

a_forever_dream的博客 4775

AHB不对称半桥反激电路设计(三)主要器件参数规格计算

本文介绍了AHB拓扑变压器的设计步骤与核心参数计算,包括主控芯片选择、工作原理分析及参数计算。作者选择DK87XXD集成MOS方案,详细阐述了输入电压范围、反射电压限定、匝比计算、工作频率设定、原副边电流值、电感量计算、磁芯选择、匝数计算、谐振电容设计等关键步骤。通过公式推导与实例计算,展示了150W电源的变压器设计过程,最终确定匝比5.5、原边22匝、副边4匝、电感量200uH等参数。文章还讨论了谐振电容与漏感的关系,为后续调试提供理论基础。该设计方法结合理论分析与工程实践,适用于AHB拓扑电源开发。

【Simon】的博客 3332

保姆级教程:用Jetson Orin Nano和ROS2 Humble搞定PIXhawk 4飞控通信(含配置文件详解)

本文提供了一份详细的Jetson Orin Nano与PIXhawk 4飞控通信配置指南,涵盖硬件连接、ROS2 Humble环境搭建、MAVROS2配置及通信调试全流程。通过实战案例和配置文件详解,帮助开发者快速实现无人机上位机与飞控的稳定通信,适用于无人机开发与自动化控制场景。

weixin_33670786的博客 475

点分树 note

算法原理 点分树是以点分治为基础的,把原树“化实为虚”的构造。我们在点分治的过程中,存储每个分治重心的上级重心,也就是点分树的父子关系。显然,根据点分治的原理,点分树的树高是log⁡n的。这样,我们可以利用这棵树来跑一些类似“从询问点出发,不断跳fa”的暴力,来解决一些树上的多次询问/修改问题。 一个比较常见的套路是这样的: 进行一次点分治,求出每个点在点分树上的父节点。 对于每个点,开一个数据结构S1存储点分树子树的贡献,再开一个数据结构S2​存储点分树父亲的贡献,用来容斥,防止算重。 对x进

weixin_45743001的博客 877

Claude Code 100个真实案例 - 用AI搭建GIS地理信息系统(地图标注+热力图)

本案例展示如何使用 Claude Code 从零搭建一个完整的 GIS 地理信息系统。我们将使用 Python + Flask 作为后端,Leaflet.js 作为前端地图引擎,实现地图标注、热力图展示、区域绘制、坐标搜索等功能。全程通过与 Claude Code 对话完成,让你感受 AI 在地理信息领域的强大开发能力。

yueyeguzhuo的专栏 112

点分树(动态点分治)

前置知识 点分治 吐槽 不知道为什么,网上有关点分树的讲解不多。而且都写的很简单(快哭了)。憨批实在是不懂。于是只能按照他们所给的思想手撸代码了。 讲解 我们在点分治中,使用了分治的思想,对于每个子树求解,我们都不会直接递归,而是找到重心后,从重心开始递归。这样在一些极端样例(一条链)的情况,仍能保证O(nlogn)O(nlogn)O(nlogn)不会退化为O(n2)O(n^2)O(n2)。这是一个很神奇的分治方式。这时我们试想这么一道题目: 给你一颗n个节点树(n<1e5),给你m次询问(m&lt

平凡人Kalzn的博客 1471

AI翻译工具自动翻译日语视频生成srt中文字幕,支持离线轻松生成任意日语视频字幕!可选择支持显卡模式和cpu模式低显存也能用

【AI离线字幕神器:日语视频一键转中文字幕】推荐一款基于Faster-Whisper的本地化字幕工具,可离线生成日语视频的中文字幕(.srt格式),支持CPU/GPU加速处理。实测1小时视频最快4-5分钟完成翻译,无需联网保护隐私。操作简单只需拖拽文件,支持批量处理音频(mp3/wav)和视频(mp4/mkv)文件,还能自定义输出格式和参数调整。特别适合需要观看无字幕日语资料的用户,堪称技术宅必备神器。下载地址附后,包含详细使用教程和参数配置说明。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+

韩版传奇 2 源码分析与 Unity 重制(一)服务端 TCP 状态管理

该专题将会分析 LOMCN 基于韩版传奇 2,使用 .NET 重写的传奇源码(服务端 + 客户端),分析数据交互、状态管理和客户端渲染等技术,此外笔者还会分享将客户端部分移植到 Unity 和服务端用现代编程语言重写的全过程。本文重点介绍了服务端的启动链路、网络初始化和连接处理这三个过程,并简要分析的游戏循环的实现与数据包处理,在下一篇文章中,我们会从客户端角度分析从游戏启动、登录、游戏开始和基础游戏交互的全流程。

东方猫的博客 2497

BZOJ4317Atm的树&BZOJ2051A Problem For Fun&BZOJ2117[2010国家集训队]Crash的旅游计划——二分答案+动态点分治(点分树套线段树/点分树+vector...

题目描述 Atm有一段时间在虐qtree的题目,于是,他满脑子都是tree,tree,tree…… 于是,一天晚上他梦到自己被关在了一个有根树中,每条路径都有边权,一个神秘的声音告诉他,每个点到其他的点有一个距离(什么是距离不用说吧),他需要对于每个点回答:从这个点出发的第k小距离是多少; 如果atm不能回答出来,那么明天4019的闹钟将不会响,4019全寝可能就迟到了,所以atm希望你...

weixin_34138377的博客 104

抓包工具:Fiddler下载、安装、使用 教程

文章目录抓包工具:Fiddler下载、安装、使用 教程一、Fiddler 下载二、Fiddler 安装三、Fiddler 使用3、Statistics 请求的性能数据分析4、Inspectors 查看数据内容5、AutoResponder 允许拦截指定规则的请求6、Composer 自定义请求发送服务器7、Filters 请求过滤规则8、Timeline 请求响应时间9、Fiddler 设置解密HTTPS的网络数据10、Fiddler 内置命令与断点 抓包工具:Fiddler下载、安装、使用 教程 Fidd

Sumarua的博客 17万+

动态树分治

在动态点分治的过程中,一个结点在其点分树上的祖先结点的信息中可能会被重复计算,这是我们需要消去重复部分的影响。的距离信息,由于本题贪心的求答案方法,且两个来自于同一子树的路径不能成为一条完成的路径,我们只在这个堆中插入其自己的值和其每个子树中的最大值。我们发现,计算点分树中同一层的结点所代表的连通块(即以该结点为分治中心的连通块)的大小总和是。由于树的形态在动态点分治的过程中不会改变,所以点分树的形态在动态点分治的过程中也不会改变。这意味着,点分治的时间复杂度是与点分树的深度相关的,若点分树的深度为。

w_w_wwwww的博客 1046

Qt6导航组件系列专栏:30+常见导航场景的实现

本文介绍了Qt6导航组件系列专栏,涵盖30+常见导航场景的实现方案。专栏分为7组:基础侧边栏系列、社交与协作导航系列、文件与项目导航系列、工业与车载导航系列、创意与扩展导航系列、办公与效率导航系列、流程与引导导航系列。

u011186532的专栏 1132

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

树分治——详解

所有完全位于其子树中的路径可以分为两种,一种是经过当前根节点的路径,一种是不经过当前根节点的路径。对于经过当前根节点的路径,又可以分为两种,一种是以根节点为一个端点的路径,另一种是两个端点都不为根节点的路径。所以,对于枚举的根节点。到所有节点路径上的颜色数量之和,可是如果用这个方法,在点分治中是不好统计答案的,因为这样很难合并从当前根出发的两棵子树的信息。,我们先计算在其子树中且经过该节点的路径对答案的贡献,再递归其子树对不经过该节点的路径进行求解。减去上一层的点的重儿子大小,得到的就是这一层的总大小。

w_w_wwwww的博客 1039

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

点分治、点分树的理解

告诉我们一棵无根树,求解树上距离关系等如有多少条长度不超过K的路径,如果直接求解可能时间复杂度会很大,我们可以通过换的重心的方式来实现降低时间复杂度。

weixin_69172093的博客 448

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

点分治 & 点分树 学习笔记

至此,我们已经了解了这道题中的点分治做法,可以归纳成下面几步:找重心,作为根;树形 dp+ 双指针求解每个询问;递归求解每个子树。而点分治的大多数问题,只是把第222步改一改,总体思路都是一样的。

RabbieWjy的博客 454

学习笔记--点分树

然后考虑两对点,做法就是点分治套点分树,对 x,a 进行点分治,然后将在这一层的操作处理掉,按顺序对 y,b 进行点分树上的修改和查询。具体就是先建一棵点分树,然后将每个操作压入所有涉及到的分治重心上,这里直接在点分树上跳就可以。点分树是通过更改原树形态使树的层数变为稳定 log⁡� 的一种重构树。就是通过点分治找重心的方式,将这一层重心为上一层重心的儿子。子任务二可以直接拿点分树做,就是对于每个重心维护到这个点距离最近的点的距离。—— oi-wiki。一开始发现建树错了,然后发现是原先的点分治错了。

liusuihuashang的博客 167

点分治与点分树 学习笔记

点分治与点分树qwq

zcxxn的博客 860

[BZOJ4317][Atm的树][LCA+点分治]

[BZOJ4317][Atm的树][LCA+点分治]题目大意:求大小为NN一棵无根树上每个点和其它所有点树上路径中第KK长的路径。思路:这种树上路径统计问题应该一眼就能看出是树分治裸题吧。。。但是即使是裸的,代码量依然大得吓人(所以LCA倍增数组开小了一位刚好溢出调了好久。)先对树点分一遍,对每个重心所管辖的所有子节点连接重心的路径都维护到重心上的权值线段树(线段树要动态开不然会炸),还要预处理出点

羽裳 788

[BZOJ2117][2010国家集训队]Crash的旅游计划

题意:给一棵树,求从每个点开始走向其它n-1个点的距离中第k大值。 又是第k大简直cqoi既视感23333 其实我一开始看到这个第k大就想起了cqoi那个k光滑数,那个题是用持久化可并堆做dp,然后这个题我就想能不能写个主席树合并然后用主席树跑树dp来表示每个点走到其它点的距离什么的,然后发现不可做。。 然后再想了想,发现就是紫荆花弱化版,然后看了看时限,150秒,就觉得非常靠谱。 考虑二

AZUI _ oi memories 1673

bzoj 4317: Atm的树 树分治

一道比较经典的树分治把。。        二分答案,然后在按照点分治后得到的重心树中找距离 AC代码如下: #include #include #include #include #define inf 1000000000 #define N 30005 #define M 1200005 using namespace std; int n,k,m,cnt,rt,tot=1,all,p

lych的博客 1093

关于点分治的理解

【引言】 由于树具有一般的图没有的特点,所以在竞赛中的应用更广。 在一些树上路径问题中,暴力求解时间复杂度过高,往往需要一些更为高效的算法,点分治就是其中之一。 【流程】 1、首先选取一个点,把无根树变成有根树。   那么如何选点呢? ——树型动规   因为树是递归定义的,所以我们当然希望递归的层数最小。   每次选取的点,要保证与此点相连的结点数最多的连通块的结点数...

anzhi7214的博客 211

BZOJ1095 动态点分治(点分树)

题意: 操作1.修改一个点的颜色(黑白互换) 操作2.询问所有黑色点之间最远距离 点分树:当我们可以形如点分治一样的统计答案,即每次确定一个重心,然后计算他们子树之间的贡献和得出答案的时候 我们可以将每个区域的重心作为其所有子树的重心的父亲,构成一颗新的树,显然这棵树的深度不会超过logn 每次对于单点(边)更新的时候,只要对其所有的父亲更新,就只需要更新log个点,这样...

weixin_30486037的博客 260
上一篇: [BZOJ2712][Violet 2][类欧几里得算法]棒球
下一篇: [BZOJ4623][树分治][矩阵][数学]Styx
LowestJN
博客等级 码龄10年 76粉丝 422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值