SPOJ QTREE2 Query on a tree II (倍增LCA)

树莓派入门教程 - 0 - 准备篇 - 0.0 SD卡制作树莓派系统镜像启动盘 开机 电脑需要提前安装的工具: sd卡格式化工具SDFormatter,官网下载链接:https://www.sdcard.org/downloads/formatter/ 镜像烧录工具Win32 Disk Imager,官网下载链接:https://win32diskimager.download/ 使用到的硬件: 一张容量大于等于16GB的TF卡 + 读卡器; 树莓派板卡。3B、3B+、4B等各型号均可,带有 HDMI接口即可。 HDMI接口的显示屏。 鼠标、键盘、电脑。 1.... 阅读详情

题意:

一颗树上,两种操作,一种问两点的距离,另一个问路上第k个节点编号

思路:

距离可以很简单地求,求第k个节点编号,我们可以把路径切成两段,一段是u到LCA,一段是LCA到v,那么我们看一下k属于哪一段,就能用常规的倍增去求那个点了

错误及反思:

代码:

#include<bits/stdc++.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N = 10100;
struct EDGE{
    int to,next,val;
}e[N*2];
int tot,n,T;
int point[N][20],val[N][20],depth[N],fi[N],fa[N],;
char ta[10];
void addedge(int x,int y,int z)
{
    e[tot].to=y;
    e[tot].val=z;
    e[tot].next=fi[x];
    fi[x]=tot++;
    e[tot].to=x;
    e[tot].val=z;
    e[tot].next=fi[y];
    fi[y]=tot++;
}
void init()
{
    tot=0;
    memset(fi,-1,sizeof(fi));
}
void dfs(int now,int fa,int de){
    depth[now]=de;
    point[now][0]=fa;
    for(int i=fi[now];i!=-1;i=e[i].next)
        if(e[i].to!=fa){
            val[e[i].to][0]=e[i].val;
            dfs(e[i].to,now,de+1);
        }
}
void getlca()
{
    for(int i=1;i<=14;i++){
        for(int j=1;j<=n;j++){
            point[j][i]=point[point[j][i-1]][i-1];
            val[j][i]=val[j][i-1]+val[point[j][i-1]][i-1];
        }
    }
}

void solve(int a,int b){
    if(depth[a]>depth[b])
        swap(a,b);
    int ans=0;
    for(int i=14;i>=0;i--)
        if(depth[point[b][i]]>=depth[a]){
            ans+=val[b][i];
            b=point[b][i];
        }
    if(a!=b){
        for(int i=14;i>=0;i--){
            if(point[a][i]!=point[b][i]){
                ans+=val[a][i]+val[b][i];
                a=point[a][i];
                b=point[b][i];
            }
        }
    }
    if(a!=b) ans+=val[a][0]+val[b][0];
    printf("%d\n",ans);
}
int lca(int a,int b){
    if(depth[a]>depth[b])
        swap(a,b);
    for(int i=14;i>=0;i--)
        if(depth[point[b][i]]>=depth[a])
            b=point[b][i];
    if(a==b) return a;

    for(int i=14;i>=0;i--){
        if(point[a][i]!=point[b][i]){
            a=point[a][i];
            b=point[b][i];
        }
    }
    return point[a][0];
}
int main(){
    scanf("%d",&T);
    while(T--){
        init();
        scanf("%d",&n);
        for(int i=0,u,v,w;i<n-1;i++){
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);
        }
        dfs(1,1,1);
        getlca();
        while(scanf("%s",ta)&&ta[1]!='O'){
            if(ta[1]=='I'){
                int tb,tc;
                scanf("%d%d",&tb,&tc);
                solve(tb,tc);
            }
            else{
                int tb,tc,k;
                scanf("%d%d%d",&tb,&tc,&k);
                int LCA=lca(tb,tc);
                if(depth[tb]-depth[LCA]+1>=k){
                    k--;
                    int now=0;
                    while(k){
                        if(k&1) tb=point[tb][now];
                        k/=2;
                        now++;
                    }
                    printf("%d\n",tb);
                }
                else{
                    k-=depth[tb]-depth[LCA]+1;
                    k=depth[tc]-depth[LCA]-k;
                    int now=0;
                    while(k){
                        if(k&1) tc=point[tc][now];
                        k/=2;
                        now++;
                    }
                    printf("%d\n",tc);
                }
            }
        }
    }
}
计算机控制技术及应用 《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。 立即下载

相关推荐

Snort源代码编译 _ 采坑之旅(for Windows VS2015)

    系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《...

magictong的专栏 8888

SPOJ - QTREE2 Query on a tree II 树上倍增+LCA

题目链接:点击查看 题意:给你一棵树,DIST a b 查询a到b的距离,KTH a b c 查询a到b的路径上第c个点是啥 题解:树上倍增,先预处理每个dp[u][i],查询a,b距离时,设他们的最近公共祖先是c,那么就是跟节点到他们的距离,dis[a]+dis[b] - 2*dis[c],查询第几个的时候节点的时候,就先判断在哪一边,然后再求a或b的第几个父辈就可以了 #include...

还我笑颜 253

3D IC中Memory-on-Logic堆叠测试的DFT解决方案与工程实践

在半导体行业,随着摩尔定律逼近物理极限,3D IC技术通过芯片垂直堆叠实现性能提升和异构集成,已成为重要发展方向。其核心原理是利用硅通孔(TSV)或微凸块实现芯片间电气互连,将多个不同功能的芯片(如逻辑芯片与存储芯片)集成在一个封装内。这项技术的核心价值在于能大幅提升系统性能、降低功耗并实现更小的封装尺寸。然而,芯片堆叠后,传统的测试方法面临巨大挑战,尤其是测试访问存在物理屏障,无法直接探测被覆盖的芯片接口。为此,可测试性设计(DFT)成为确保3D IC可靠性与量产可行性的关键技术。它通过在设计阶段植入专用

weixin_42521058的博客 631

SPOJ——QTREE2 - Query on a tree II(树链剖分或者倍增法)

Description You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. Each edge has an integer value assigned to it, representing its length. W

say_c_box的博客 1079

深度探索:非线性随机森林(Nonlinear Random Forest,NL-RF)原理及应用

非线性随机森林(NL-RF)旨在通过结合集成方法与高级技术来捕捉和建模数据中的非线性关系,从而改善传统随机森林在处理复杂非线性数据结构时的表现。

qq_51320133的博客 2066

汽车行业新能源汽车数据爬虫:抓取新能源汽车数据,分析市场发展和技术创新

在汽车行业,新能源汽车市场的发展和技术创新是当前的热点话题。通过抓取新能源汽车的数据,我们可以深入了解市场趋势、消费者需求以及技术创新的方向。本文将详细介绍如何使用 Python 爬虫技术抓取新能源汽车数据,并对数据进行分析和可视化展示。

u014481728的博客 1142

【SPOJ QTREE2】QTREE2 - Query on a tree II(LCA)

You are given a tree (an undirected acyclic connected graph) withNnodes, and edges numbered 1, 2, 3...N-1. Each edge has an integer value assigned to it, representing its length. We will ask...

dingguayi7025的博客 142

UG\NX二次开发 替换部件引用集UF_ASSEM_replace_refset

替换部件引用集UF_ASSEM_replace_refset,需要替换成“完整部件(Entire Part)”需要第三个参数传入空指针或者空字符串。

王牌飞行员_里海的博客 253

SPOJ QTREE2 - Query on a tree II【树链剖分+LCA】

树剖

niiick 370

在claude code desktop中安装pdf处理skill的实战教程

本文介绍了在Claude Code Desktop中安装PDF处理Skill的详细教程。针对国内用户使用第三方API时无法直接调用官方插件的问题,提供了完整的解决方案。教程从下载Anthropic官方Skills源码开始,逐步演示了如何将PDF处理模块打包、上传至Claude Code Desktop,并最终成功加载使用。整个过程采用全流程拆解方式,确保新手也能快速上手。通过本文,读者可以掌握在非官方环境下扩展Claude Code功能的方法,从而提升工作效率

weixin_43178406的博客 9万+

095、PCIE物理层测试模式:从信号眼图到误码率实战

本文介绍了PCIe物理层测试模式的调试方法和实战经验。重点解析了环回测试、合规性测试和静默模式的应用场景及配置要点,分享了信号眼图分析、误码率测试和接收端验证的实用技巧。作者结合自身调试经历,强调物理层测试对排查信号完整性问题的重要性,建议在量产前进行基础测试,并提醒注意芯片勘误和测试模式切换等易错点。通过合理使用测试模式,可显著提高PCIe链路调试效率,确保物理层稳定可靠。

z534437748的博客 60

SPOJ-QTREE2 Query on a tree II(暴力+LCA)

题目大意:给出一棵树,3种操作 DIST u,v 询问u到v的距离 KTH k, u, v 询问u到v的路径上的第k大的边的权值解题思路:刚开始以为会爆,结果发现不会 直接暴力存储u到v的路上的所有边,再进行排序,输出第k大的边即可#include <cstdio> #include <cstring>#define N 10010struct Edge{ int to, next

静静地码 911

24、水下传感器网络中混合LEACH协议与遗传算法获取路由节点

本文提出了一种结合遗传算法与LEACH协议的混合路由方案,用于提升水下无线传感器网络(UWSN)的能量利用效率和数据传输稳定性。通过遗传算法优化簇头选择与路径规划,有效避免节点过早死亡,减少能量消耗,在200个节点场景下显著提升网络寿命。相比传统LEACH协议,该方案具有更高的能量利用率、更强的环境适应性,并支持传输历史记录与并行传输序列。实验结果显示,该方案在总能量为2000焦耳时剩余能量达75.6%,远优于LEACH的34.8%能耗表现。适用于海洋监测、石油平台监控及水下灾害预警等复杂环境应用。

i8j9k0l1的博客 112

SPOJ QTREE2 - Query on a tree II 倍增 LCA

SPOJ QTREE2 - Query on a tree II Description You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, 3…N-1. Each edge has an integer value assigned to ...

tangzhide123yy的博客 253

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

[SPOJ913]QTREE2 - Query on a tree II【倍增LCA】

题目描述 【传送门】 题目大意 给一棵树,有两种操作: 求(u,v)路径的距离。 求以u为起点,v为终点的第k的节点. 分析 比较简单的倍增LCA模板题。 首先对于第一问,我们只需要预处理出根节点到各个节点之间的距离,然后倍增LCA求解就可以了。 那么第二问我WA了6发,原来是眼瞎和手残打错了两个字符错掉了。 我们将问题分成3个部分: LCA是第k个 第k个在u到LCA的路径上 第...

weixin_30535043的博客 98

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【SPOJ - QTREE2】Query on a tree II(LCA、倍增)

题目链接 给无根一棵树,有边权,有两种询问,一种给出两个点,问这两个点的距离是多少,另一个,给给三个点,a,b,k,问从a开始到b的路径的第k个点是的编号是多少。 显然lca,关于第二询问,我们还是要求一下,这两个点的lca,因为我们要选择一个点往上倍增的去寻找第k个点,但是,万一x就是lca,x不能往上跳着找,所以,我们要交换一下,从a数第k个,相当于从b数第(路劲总点数-k+1)个,, 然而我...

Coldfresh的博客 297

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SPOJ - QTREE2 Query on a tree II 树上倍增LCA

传送门 题意:给定树和边权,在树上实现两个操作 1、求x,y两个节点之间的距离(DIST 4 6) 2、求从x出发,y为终点路径上的第k个节点(KTH 4 6 1,就是4) 操作1:dist[x] + dist[y] - 2 * dist[lca] 操作2:先求x到y的链长dep[x] + dep[y] - 2 * dep[lca],然后分情况看第k个点在x-lca链还是lca-y链,然后求祖先节...

__surtr的博客 183

【SPOJ - QTREE2】Query on a tree II(LCA,倍增)

题干: You are given a tree (an undirected acyclic connected graph) withNnodes, and edges numbered 1, 2, 3...N-1. Each edge has an integer value assigned to it, representing its length. We will ask y...

xuanweiace的博客 424

SPOJ QTREE2 Query on a tree II 倍增lca

题目:https://vjudge.net/problem/SPOJ-QTREE2题意:给定一个树,有边权,有以下操作: DIST a b:DIST\ a\ b:求aa到bb的距离 KTH a b k:KTH\ a\ b\ k:求从aa到bb路径上的第kk个节点,aa是第一个 以DONEDONE作为查询结束标志思路:第一个操作,任意一个lcalca算法都可以求出来,考虑第二种操作,最简单的方法是一步

弱智就要多努力 379

SPOJ 913 QTREE系列- Query on a tree II (倍增LCA)

题目地址:QTREE2 - Query on a tree II LCA学了离线与在线转RMQ方法后就去做这道题,于是想了好长时间也没想到怎么做。看了题解都是用的倍增LCA。。于是又去学了下倍增法求LCA,这才发现用倍增法做简直是水题。。。因为求路径的第k个点可以转化成求第k个父节点,然而倍增法的原理就是根据的父节点,于是这题就很容易解决了。。 求距离很好求。关键

scf0920 1074

SPOJ QTREE2 - Query on a tree II LCA+思维

https://www.spoj.com/problems/QTREE2/en/ You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. Each edge has an integer value assigned to it, re...

xiji333的博客 212

SPOJ Query on a tree II (倍增LCA)

QTREE2 - Query on a tree II #graph-theory #tree You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. Each edge has an integer value

K键盘里的青春K 421

SPOJ - QTREE2 Query on a tree II(LCA)

题目链接:点击查看 题目大意:给出一棵无根树,每条边都有权值,接下来有数次操作,每次操作分为两种类型: DIST x y:求出点x到点y的唯一路径上的权值和 KTH x y k:求出点x到点y的唯一路径上第k个点 题目分析:因为是无根树,所以我们随便找个节点当根就行了,为了方便,我们每次都选取第一个点当根节点,接下来对于操作1,我们在树上求一遍前缀和即可,对于操作2,涉及...

Falcon的博客 384

SPOJ QTREE2 Query on a tree II

树上倍增

YHaX的博客 496

2019.03.21【SPOJ-QTREE2】Query on a tree II(树上倍增)

传送门 虽说树剖+dfs序也可以做,但是显然没有倍增代码短。 都是倍增基础操作就不写题解了。 代码: #include<bits/stdc++.h> #define ll long long #define re register #define gc get_char #define cs const namespace IO{ inline char get_char(){...

zxyoi_dreamer的博客(不定期诈尸) 195

Query on a tree V SPOJ - QTREE5

题意 一棵树,每个节点有黑白颜色之分,q个操作,每次可以改变节点颜色或给定节点v,查询距离v最近的白色节点的距离。 思路 树分治建立重心树,这里用到一个重心树的性质,两个节点a,b在重心树中的LCA(a,b)= f 在a到b的路径上,因为由重心树的定义可知删去f后a,b必然在两个不同连通分量内。由此可以对最短路径ans进行更新,设v为查询点,g为其祖先节点,op(v)为以v为根的子树中v到白色节点...

weixin_42547447的博客 254
上一篇: HDU 5274 Dylans loves tree (树链剖分)
下一篇: SPOJ QTREE3 Query on a tree again!(树链剖分)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值