题目描述

一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成
一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I

II. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身。

感想

感觉省选中的树剖题目还是有点多的呀,而且全都是模板题,巨简单~~,QAQ。

题解

今天看到了LCT的做法,感觉不会。写一篇树链剖分的题解。
既然知道是树剖,那么就只要套模板。
第一个操作:实际操作就是单点修改\(idx[u]\)
第二个操作,和第三个操作:都是树上的路径查询,还是模板。
\(ps.\)要注意,这个数存在负数,虽然对求和没有影响,但是在求最大值的时候需要从\(-inf\)开始。

ac代码

#include<bits/stdc++.h>
#define N 30005
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
int read(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch))w|=ch=='-',ch=getchar();
    while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
int H[N],son[N],dep[N],top[N],sz[N],fa[N],idx[N],a[N],w[N];
int cnt,tot,n;
struct edge{
    int to,nt;
}E[N<<1];
void addedge(int u,int v){
    E[++cnt]=(edge){v,H[u]}; H[u]=cnt;
    E[++cnt]=(edge){u,H[v]}; H[v]=cnt;
}
struct Segment_tree{
    #define ls (nod<<1)
    #define rs (nod<<1|1)
    #define mid ((l+r)>>1)
    struct node{
        int l,r;
        LL mx,s;
    }tr[N<<2];
    void pushup(int nod){tr[nod].s=tr[ls].s+tr[rs].s; tr[nod].mx=max(tr[ls].mx,tr[rs].mx);}
    void build(int l,int r,int nod,int *a){
        tr[nod].l=l; tr[nod].r=r;
        if(l==r){tr[nod].mx=tr[nod].s=a[l]; return;}
        build(l,mid,ls,a); build(mid+1,r,rs,a);
        pushup(nod);
    }
    void update_point(int nod,int k,int w){
        int l=tr[nod].l,r=tr[nod].r;
        if(l==r){tr[nod].mx=tr[nod].s=w;return;}
        if(k<=mid) update_point(ls,k,w);
        else update_point(rs,k,w);
        pushup(nod);
    }
    LL query_sec_sum(int nod,int ql,int qr){
        int l=tr[nod].l,r=tr[nod].r; LL res=0;
        if(ql<=l&&r<=qr) return tr[nod].s;
        if(ql<=mid) res+=query_sec_sum(ls,ql,qr);
        if(qr>mid) res+=query_sec_sum(rs,ql,qr);
        return res;
    }
    LL query_sec_max(int nod,int ql,int qr){
        int l=tr[nod].l,r=tr[nod].r; LL res=-inf;
        if(ql<=l&&r<=qr) return tr[nod].mx;
        if(ql<=mid) res=max(res,query_sec_max(ls,ql,qr));
        if(qr>mid) res=max(res,query_sec_max(rs,ql,qr));
        return res;
    }
}tr;
void dfs1(int u,int ft,int dp){
    fa[u]=ft; dep[u]=dp; sz[u]=1;
    int maxson=-1;
    for(int e=H[u];e;e=E[e].nt){
        int v=E[e].to; if(v==fa[u]) continue;
        dfs1(v,u,dp+1); sz[u]+=sz[v];
        if(sz[v]>maxson) maxson=sz[v],son[u]=v;
    }
}
void dfs2(int u,int tp){
    top[u]=tp; idx[u]=++tot; a[tot]=w[u];
    if(!son[u]) return; dfs2(son[u],tp);
    for(int e=H[u];e;e=E[e].nt){
        int v=E[e].to; if(v==fa[u]||v==son[u]) continue;
        dfs2(v,v);
    }
}
LL query_sum(int u,int v){
    LL res=0;
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        res+=tr.query_sec_sum(1,idx[top[u]],idx[u]);
        u=fa[top[u]];
    }
    if(dep[u]>dep[v]) swap(u,v);
    res+=tr.query_sec_sum(1,idx[u],idx[v]);
    return res;
}
LL query_max(int u,int v){
    LL res=-inf;
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        res=max(res,tr.query_sec_max(1,idx[top[u]],idx[u]));
        u=fa[top[u]];
    }
    if(dep[u]>dep[v]) swap(u,v);
    res=max(res,tr.query_sec_max(1,idx[u],idx[v]));
    return res;
}
int main(){
    cnt=tot=0;
    n=read();
    for(int i=1;i<n;i++) addedge(read(),read());
    for(int i=1;i<=n;i++) w[i]=read();
    dfs1(1,0,1); dfs2(1,1); tr.build(1,n,1,a);
    int q=read();
    while(q--){
        char opt[10]; scanf("%s",opt); int u=read(),x=read();
        if(opt[0]=='C') tr.update_point(1,idx[u],x);
        else{
            if(opt[1]=='M') printf("%lld\n",query_max(u,x));
            else printf("%lld\n",query_sum(u,x));
        }
    }
    return 0;
}

[luogu2590][bzoj1036][ZJOI2008]树的统计的更多相关文章

  1. [BZOJ1036][ZJOI2008]树的统计Count 解题报告|树链剖分

    树链剖分 简单来说就是数据结构在树上的应用.常用的为线段树splay等.(可现在splay还不会敲囧) 重链剖分: 将树上的边分成轻链和重链. 重边为每个节点到它子树最大的儿子的边,其余为轻边. 设( ...

  2. bzoj1036 [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 12646  Solved: 5085 [Subm ...

  3. bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题

    [ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...

  4. bzoj千题计划124:bzoj1036: [ZJOI2008]树的统计Count

    http://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分板子题 #include<cstdio> #include<iost ...

  5. BZOJ1036 [ZJOI2008]树的统计Count 树链剖分

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1036 题意概括 一个树,每个节点有一个权值.3种操作. 1:修改某一个节点的权值. 2:询问某两个 ...

  6. 【lct】bzoj1036 [ZJOI2008]树的统计Count

    题意:给你一棵树,点带权,支持三种操作:单点修改:询问链上和:询问链上max. 这里的Query操作用了与上一题不太一样的做法(上一题用那种做法,因为在边带权的情况下换根太困难啦): 先ChangeR ...

  7. BZOJ1036[ZJOI2008]树的统计Count 题解

    题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.有一些操作:1.把结点u的权值改为t:2.询问从点u到点v的路径上的节点的最大权值 3.询问从点u到点v的路径上的节点的权值和 ...

  8. bzoj1036 zjoi2008 树的统计 count

    填坑= =第一道裸树剖 #include<cstdio> #include<algorithm> #include<cstring> #include<cst ...

  9. bzoj1036 [ZJOI2008]树的统计

    一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从 ...

随机推荐

  1. VB6 加密解密字符串

    Public Function EnCodeStr(ByVal password As String) As String Dim il_bit, il_x, il_y, il_z, il_len, ...

  2. Ionic Contoller类与Service类分开需要注意的问题

    看了别人的项目把Controller类和Service类都写在了app.js文件里面,这不符合我的风格,想把他们分开成单独的文件,确遇见以下错误提示: ionic.bundle.min.js:133 ...

  3. C# 获取电脑MAC地址,IP地址,物理内存,CPU序列号,硬盘ID..........................

    上班很忙,自己做个记录 代码如下: 需要引入:System.Management 代码如下: using System; using System.Collections.Generic; using ...

  4. 【APIO2016】烟火表演

    题面 题解 神仙题目啊QwQ 设\(f_i(x)\)表示以第\(i\)个点为根的子树需要\(x\)秒引爆的代价. 我们发现,这个函数是一个下凸的一次分段函数. 考虑这个函数合并到父亲节点时会发生怎样的 ...

  5. Centos7下ELK+Redis日志分析平台的集群环境部署记录

    之前的文档介绍了ELK架构的基础知识,日志集中分析系统的实施方案:- ELK+Redis- ELK+Filebeat - ELK+Filebeat+Redis- ELK+Filebeat+Kafka+ ...

  6. Record for Individual Project ( Word frequency program )

    1.  预计时间 ● 对问题总体的理解.规划:10 min ● 设计编写程序:5 h ● 调试: 分模块-40 min; 总体-40min ● 测试(性能分析).改进:1 h 2.  实际用时 ● 对 ...

  7. Some questions after Reading 《移山之道》

    很少见到用故事的形式来写技术书籍的,这是我看到的第一本,书写得比较有趣,看了之后也是有一定的收获.  作者在此书中旁征博引,引用的东西虽不能一个一个查询是否正确,但是每次读到时候,感觉一种现代的软件工 ...

  8. Linux内核总结博客 20135332武西垚

    http://www.cnblogs.com/wuxiyao/p/5220677.htmlhttp://www.cnblogs.com/wuxiyao/p/5247571.htmlhttp://www ...

  9. 7-Python3从入门到实战—基础之数据类型(字典-Dictionary)

    Python从入门到实战系列--目录 字典的定义 字典是另一种可变容器模型,且可存储任意类型对象:使用键-值(key-value)存储,具有极快的查找速度: 字典的每个键值(key=>value ...

  10. PAT 1018 锤子剪刀布

    https://pintia.cn/problem-sets/994805260223102976/problems/994805304020025344 大家应该都会玩“锤子剪刀布”的游戏:两人同时 ...