[点分树][二分] [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中的耦合线设计带通滤波器并转换为HFSS模型

耦合线带通滤波器是一种常用的微带滤波器形式,由多个长度为四分之一波长的耦合线节组成,在所需频点形成谐振,构成滤波器的频率响应特性。首先我们先来了解一下耦合线带通滤波器的电路结构,见下图:包括两对耦合线,中间为公共连接点,其中两对耦合线的偶奇模阻抗为(Z1e,Z1o)和(Z2e,Z2o,端口输入阻抗为Z0)。2.指定一个初始奇偶模值,ADS优化出一个合适的结果,通过奇偶模值利用linecalc工具计算出微带耦合线尺寸。假设中心频率为2GHz,则对应频点的电长度为。5.运行结果,两个软件仿真结果基本一致。

auqihc的博客 2227

点分树——动态点分治

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

a_forever_dream的博客 4775

新手必看:手把手教你如何通过Github提交CVE漏洞(附完整截图流程)

本文为安全研究新手提供了一份详尽的CVE漏洞提交实战指南。文章重点介绍了如何通过Github平台,从漏洞发现、验证、撰写专业报告到最终提交CVE申请的全流程,并附有完整的截图和沟通模板,帮助初学者迈出负责任漏洞披露的第一步。

ttt77的博客 1252

自动驾驶关键技术(一):时间敏感网络TSN

时间敏感网络TSN的基本概念、协议族介绍和开发流程。

3079

点分树 note

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

weixin_45743001的博客 877

STM32H745xI双核芯片SMPS/LDO配置误区:从复位失败到精准排查的实战复盘

本文详细分析了STM32H745xI双核芯片在SMPS/LDO配置中的常见误区,特别是复位失败问题的排查过程。通过对比参考板与故障板的波形数据,揭示了电感选型不当导致的电源稳定性问题,并提供了硬件设计检查清单和调试技巧,帮助开发者避免类似陷阱。

weixin_42531588的博客 264

点分树(动态点分治)

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

平凡人Kalzn的博客 1471

uni-app - 最详细 H5 网页接入微信登录功能,提供公众号配置与详细注释示例代码(移动端网页实现点击登录按钮后 调用微信公众号授权登录功能 详细讲解接入流程与详细示例代码)官方最新超级详细教程

uniapp中H5微信登录,uniapp H5微信授权登录,微信公众号第三方网页(H5)授权登录(OAuth2.0)流程及逻辑详细教程,UNIAPP 开发H5 怎么实现微信公众号登录功能,uniapp如何实现H5网页的公众号微信登录,怎么做uniapp微信登录,uniapp h5项目怎么实现微信登录的功能,uniapp微信浏览器H5授权微信登录,UniApp开发H5接入微信登录的全过程,uniapp的H5页面使用微信登录,uniapp H5微信授权登录,H5之微信授权登陆 (uniapp网页版微信授权登录)

🏆 前端领域优质创作者 7407

HRNet训练自己的分类数据

1.搭建环境 为了防止和服务器上的环境冲突,这里利用conda搭建环境。 Install PyTorch=0.4.1 following theofficial instructions git clonehttps://github.com/HRNet/HRNet-Image-Classification Install dependencies: pip install -r requirements.txt ...

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 5847

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

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

weixin_34138377的博客 104

基于VisionMaster实现数据实时存储至MySQL (二)

摘要:之前的分享主要聚焦于简单的一维数据实时存储。但在做缺陷检测项目时,情况往往更加复杂:一张检测图像中可能同时存在多个缺陷,每个缺陷都有一组独立的核心参数(如质心、长短轴、面积等)。如何在 MySQL 中记录这些成组出现的缺陷数据,而不只是简单的单条记录?

haier123888的博客 226

动态树分治

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

w_w_wwwww的博客 1046

Amazon SES 移出沙盒完整指南 & 高通过率模板

AWS SES沙盒模式转正式模式申请指南 申请正式模式需通过AWS审核,常见被拒原因包括邮件用途不清晰、缺少退订机制或发送量不合理。人工申诉需登录AWS Support Center提交服务限额提升请求,填写详细的公司信息、邮件用途及合规措施。 高通过率申诉模板需包含: 公司信息:名称、网址及与AWS的合作情况。 邮件规范:明确类型(交易/营销)、退订链接及退信处理机制。 发送计划:合理预估发送量,确保合规。 关键点:真实信息、用途清晰、退订机制完善、发送量合理。首次被拒可修改后重新提交。

xianyinsuifeng的博客 328

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

树分治——详解

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

w_w_wwwww的博客 1039

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

点分治、点分树的理解

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

weixin_69172093的博客 448

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、付费专栏及课程。

余额充值