SPOJ QTREE Query on a tree(树链剖分)

攻防世界 misc题GFSJ1129-【您看我还有机会吗?】 我们发现了隐藏内容,一开始我以为那个英文就是flag,提交后发现不对,然后我想只有一张图片然后图片上的隐写内容又不是flag,那必定还有什么文件被隐藏了,于是我们打开VMware并启动Ubuntu,使用binwalk分析一下有没有隐藏文件,我们要在Terminal中分析,如下。我们发现里面有一个flag.txt文件,我们尝试提取里面内容,但发现又要密码,我们想起了之前图片上的隐藏内容,我们将那段英文输入(包括空格和符号,在VMware中输入密码不会有显示,你看到的就像没输入一样),然后我们看到如下。 阅读详情

题意:

给你一棵树,然后查询点u到v之间的最大值,并且中途可能会修改某个边的值

思路:

http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html
↑这里树剖讲的很好
树剖基本题,没什么坑点但是写的时候,对于点的上下关系经常判断错,导致wa了一上午。树剖整体思路就是将树的边进行划分,最终达到类似倍增那样的不断跳跃来节省时间,同时把树按边转化为线性,这样就能用线段树维护了。

错误及反思:

刚刚学完去写了下模板题,发现树剖的代码量确实不小,感觉树剖和dfs序都是差不多一种东西,都是把树转化为线性结构,只不过一个的核心是点的处理,一个核心是边的处理

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int N=20100;
pair<int,int> edge[N];
int segtree[N*4];
int depth[N],fa[N],son[N],top[N],si[N],id[N];
int n,tot,tid;
int first[N];
pair<int,pair<int,int> >  b[N];
void addedge(int x,int y)
{
    edge[tot].first=y;
    edge[tot].second=first[x];
    first[x]=tot++;
    edge[tot].first=x;
    edge[tot].second=first[y];
    first[y]=tot++;
}
void dfs1(int now,int bef,int dep)
{
    depth[now]=dep;
    fa[now]=bef;
    si[now]=1;
    for(int i=first[now];i!=-1;i=edge[i].second)
    {
        if(edge[i].first!=bef)
        {
            dfs1(edge[i].first,now,dep+1);
            si[now]+=si[edge[i].first];
            if(son[now]==-1) son[now]=edge[i].first;
            else son[now]=si[edge[i].first]>si[son[now]]?edge[i].first:son[now];
        }
    }
}
void dfs2(int now,int tp)
{
    id[now]=tid++;
    top[now]=tp;
    if(son[now]!=-1) dfs2(son[now],tp);
    for(int i=first[now];i!=-1;i=edge[i].second)
        if(edge[i].first!=fa[now]&&edge[i].first!=son[now])
            dfs2(edge[i].first,edge[i].first);
}
int findmax(int L,int R,int l,int r,int rt)
{
    if(L<=l&&R>=r)
        return segtree[rt];
    int m=(l+r)/2;
    int ans=0;
    if(L<=m) ans=max(ans,findmax(L,R,lson));
    if(R>m) ans=max(ans,findmax(L,R,rson));
    return ans;
}
int query(int L,int R,int l,int r,int rt)
{
    int fa1=top[L],fa2=top[R];
    int ans=0;
    while(fa1!=fa2)
    {
         if(depth[fa1]<depth[fa2])
         {
             swap(fa1,fa2);
             swap(L,R);
         }
         ans=max(ans,findmax(id[fa1],id[L],0,tid-1,1));
         L=fa[fa1];
         fa1=top[L];
    }
    if(L==R) return ans;
    if(depth[L]>depth[R]) swap(L,R);
    ans=max(ans,findmax(id[son[L]],id[R],0,tid-1,1));
    return ans;
}
void update(int pos,int val,int l,int r,int rt)
{
    if(pos==l&&l==r)
    {
        segtree[rt]=val;
        return ;
    }
    int m=(l+r)/2;
    if(pos<=m) update(pos,val,lson);
    else update(pos,val,rson);
    segtree[rt]=max(segtree[rt<<1],segtree[rt<<1|1]);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(first,-1,sizeof(first));
        memset(son,-1,sizeof(son));
        scanf("%d",&n);
        tot=0;tid=0;
        for(int i=0;i<n-1;i++)
        {
            scanf("%d%d%d",&b[i].second.first,&b[i].second.second,&b[i].first);
            addedge(b[i].second.first,b[i].second.second);
        }
        dfs1(1,1,1);
        dfs2(1,1);
        for(int i=0;i<n-1;i++)
        {
            if(depth[b[i].second.first]<depth[b[i].second.second]) swap(b[i].second.first,b[i].second.second);
            update(id[b[i].second.first],b[i].first,0,tid-1,1);
        }
        while(1)
        {
            char temp[10];
            int ta,tb;
            scanf("%s",temp);
            if(temp[0]=='D')
                break;
            else
            {
                scanf("%d%d",&ta,&tb);
                if(temp[0]=='Q')
                    printf("%d\n",query(ta,tb,0,tid-1,1));
                else
                    update(id[b[ta-1].second.first],tb,0,tid-1,1);
            }
        }
    }
}
华为的C语言编程规范.pdf 华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。 立即下载

相关推荐

基于Simulink的二相混合式步进电机驱动器快速建模与仿真实践

本文详细介绍了如何利用Simulink对二相混合式步进电机驱动器进行快速建模与仿真。通过从零搭建电机数学模型、设计H桥控制逻辑,并集成步进时序,手把手指导读者创建可运行的仿真模型文件。该方法能有效验证控制策略,避免硬件调试风险,是学习与实践电机驱动开发的理想途径。

weixin_29171087的博客 147

SPOJ QTREE - Query on a tree 【树链剖分】

QTREE - Query on a tree #number-theory You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. We will ask you to perfrom some instruc

世界很大 550

【Audio driver】深入解析mixer_paths.xml中的音频通路配置

本文深入解析了Android音频驱动开发中的核心配置文件mixer_paths.xml。文章以高通平台为例,详细阐述了音频通路(FE、BE、DSP、Device)的概念与连接逻辑,并通过实战案例拆解了扬声器与麦克风通路的配置方法、关键控件作用及调试技巧,是理解与定制Android音频系统的实用指南。

ik6789012的博客 357

SPOJ - QTREE Query on a tree树链剖分

SPOJ - QTREE Query on a tree树链剖分 You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, 3…N-1. We will ask you to perfrom some instructions of the fol

weixin_40433319的博客 327

IC设计新手必看:如何正确使用去耦电容(decap)避免电源噪声?

本文深入探讨了IC设计中去耦电容(decap)的应用技巧,从核心原理到布局实现,帮助新手工程师有效抑制电源噪声。文章详细解析了MIM、MOM等电容类型的特性与选择策略,并提供了先进的布局技巧和验证方法,特别适用于28nm以下先进工艺的电路设计挑战。

weixin_30555125的博客 114

1.triton镜像使用

1)拉取镜像2)启动容器指定模型仓库时可以执行server下的./fetch_model.sh,见2.2部分GPU版本的启动CPU版本的启动区别只在于--gpus=1这个参数注意:docker19.03之前的版本使用gpu要指定显卡硬件名,docker19.03之后的需要安装nvidia-container-toolkit或nvidia-container-runtime安装之后要重启docker查看gpus参数是否安装成功重新执行我遇到了如下错误先使用非GPU版本的。

天启的博客 2077

[spoj QTREE Query on a tree]树链剖分

[spoj QTREE Query on a tree]树链剖分题目链接:[spoj QTREE Query on a tree] 题意描述:给定一棵顶点数为N的带权树。有Q次操作,每次操作或者改变第ii条边的权值,或者查询顶点uu到vv的路径上面的最长边。 解题思路: 树链剖分的入门题。今天比较系统的学习了一下树链剖分。其实树链剖分就是将树上的边(点)映射到若干条连续的线段上。然后结

Fighting! 662

Lumerical-定向耦合器1

概述:本文章使用FDE求解器对定向耦合器进行了数值仿真,讨论了耦合器的间距相关性,耦合长度相关性,波长相关性。讨论了脊形波导和条形波导两种情况。

m0_61776728的博客 4611

SPOJ 375 QTREE Query on a tree 树链剖分

题目:http://www.spoj.com/problems/QTREE/en/ 题意:给定一棵有n个点的树,每条边都有权值。有两种操作,第一种是询问两点间路径上边权的最大值,第二种是改变输入顺序中第i条边的权值 思路:树链剖分第一题。 siz[v]表示以v为根的子树的节点数 dep[v]表示v的深度(根深度为1) top[v]表示v所在的链的顶端节点 fat[v]表

弱智就要多努力 533

算法 | 植物根茎生长优化算法(PRGO)原理、公式及应用,matlab代码(2025最强优化算法)

【代码】算法 | 植物根茎生长优化算法(PRGO)原理、公式及应用,matlab代码(2025最强优化算法)

尘世冰封的专栏 1015

高通Camx功能feature分析之一:remosaic功能导通

本文详细介绍了S5K3P9S传感器前置场景中SW Remosaic功能的实现流程。首先需在sensorxml中确认支持SW Remosaic类型,并集成remosaic相关库文件(libremosaic_wrapper.so等)。核心实现包括:初始化阶段调用InitFrontSamsungRemosaic();执行线程DeferFrontInitThread()读取校准数据;通过DoSamsungRemosaic()执行remosaic算法处理;最后在析构函数中调用DeinitFrontSamsungRem

1695

spoj375QTREE - Query on a tree(树链剖分)

题目链接 QTREE - Query on a tree #tree You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. We will ask you to perfrom some instru

fouzhe的博客 528

17. ADC开发

bes2700 支持2路ADC。

雪飞_海 340

SPOJ - QTREE Query on a tree 树链剖分模板题

传送门:SPOJ - QTREE 题意:给出一棵树,和两种操作: 1.把第i条边的权值改成ti。 2.询问a节点到b节点之间的路径中的最大边权值。 思路:树链剖分裸题。 树链剖分学习:点击打开链接 个人理解:树链剖分有点类似于树的dfs序 + 线段树维护,不过是用各种数据结构去维护划分出来的边罢了。 代码: #include #define ll long long #define

WA是一笔财富 251

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SPOJ QTREE Query on a tree 树链剖分

新的树链剖分模板实验

Code of Duty 865

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[spoj 375]QTREE - Query on a tree[树链剖分]

You are given a tree (an acyclic undirected connected graph) withNnodes, and edges numbered 1, 2, 3...N-1. We will ask you to perfrom some instructions of the following form: CHANGE i ti: ...

dirushi6322的博客 113

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

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

SPOJ QTREE Query on a tree(树链剖分)

SPOJ QTREE Query on a tree 题目链接 树链剖分基础题 代码: #include #include #include #include using namespace std; const int N = 10005; int dep[N], top[N], sz[N], son[N], fa[N], id[N], idx, val[N]

Remilia's 1047

【SPOJ】【树链剖分】【线段树】QTREE Query on a Tree

SPOJ QTREE Query on a Tree 题目 题目传送门 题目大意 给定一棵节点数为NNN的树,有两种操作:CHANGE i ti,QUERY a b,分别表示将编号为i的边的权值改为ti,查询由节点a到节点b路径中的最大值。对于每一个QUERY操作,输出节点a到节点b路径中的最大值。 思路 树链剖分板子题。 我们使用线段树来维护最大权值,则这道题树...

IDDFS 476

SPOJ - QTREE3Query on a tree again!——树链剖分

【题目描述】 SPOJ - QTREE3Query on a tree again! 【题目分析】 题目要求是输出从111到xxx的路径上遇到的第一个黑色的点。我们可以用树链剖分(不了解的同学请出门左拐,详见树链剖分入门) 我们用线段树维护每个区间第一次遇到黑点的位置,这样访问出的点同样是从1开始路径上的第一个点。因为我们总是从根节点1开始,我们在访问的时候从后往前每次访问重链时在线段树上都是一...

T_T233333333的博客 269

SPOJ - QTREE2 Query on a tree II树链剖分

SPOJ - QTREE2 Query on a tree IIYou 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

weixin_40433319的博客 252

SPOJ 375 QTREE Query on a tree 树链剖分水题

题目大意: 给定一棵树后两种操作 修改边权, 询问两点间路径上的边权的最大值 大致思路: 树链剖分水题 剖分之后线段树维护最大值即可, 单点更新区间查询 代码如下: Result  :  Accepted     Memory  :  4403 KB     Time  :  490 ms /* * Author: Gatevin * Created Time:

Gatevin的专栏 530

[SPOJ375]QTREE - Query on a tree【树链剖分】

题目描述 给你一棵树,两种操作。 修改边权,查找边权的最大值。 分析 我们都知道,树链剖分能够维护点权。 而且每一条边只有一个,且唯一对应一个儿子节点,那么就把信息放到这个儿子节点上。 注意,lca的信息不能算到,也就是当查询到了\(top[u]=top[v]\)的时候,要从\(idx[u]+1\)到\(v\)的查询,因为\(idx[u]\)为lca。 代码 #include <b...

weixin_30900589的博客 127

SPOJ - QTREE Query on a tree ( 树链剖分 入门)

传送门:http://www.spoj.com/problems/QTREE/en/ You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. We will ask you to perfrom some instructions

Vision 455

SPOJ QTREE Query on a tree 树链剖分

树链剖分,注意一下边的关系即可。传送门:http://www.spoj.com/problems/QTREE/en/#include <map> #include <set> #include <queue> #include <cmath> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #in

NM的专栏 420

SPOJ375[QTREE - Query on a tree] 树链剖分

spoj375 QTREE 树链剖分

Venishel的博客 318

SPOJ-QTREE Query on a tree 树链剖分

欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - SPOJ-QTREE 题意概括   给你一颗树,每两点之间有权值,然后改变一些权值,问一条路径上的最大值。 题解   树链剖分裸题。 代码 #include <cstring> #include <algorithm> #includ...

weixin_30627341的博客 127
上一篇: Codeforces Round #301 (Div. 2) D. Bad Luck Island(概率dp)
下一篇: SPOJ GRASSPLA Grass Planting(树链剖分)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值