正解:树链剖分+线段树

解题报告:

传送门!

树链剖分+线段树算是基操了趴,,,

就无脑码码码,没有任何含金量,不需要动脑子,然后码量其实也不大,就很爽

比树剖的板子还要板子一些hhhhh

放下代码就欧克了QwQ

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define gc getchar()
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define fy(i) edge[i].fy
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt)

+;
int n,q,ed_cnt,head[N],fa[N],top[N],sz[N],sn[N],dfn[N],low[N],rk[N],dfn_cnt,val[N];
struct ed{int to,nxt;}edge[N];
struct node{int dat,tag;}tr[N];

il int read()
{
    rc ch=gc;ri x=;rb y=;
    '))ch=gc;
    ;
    )+(x<<)+(ch^'),ch=gc;
    return y?x:-x;
}
il char rd(){rc ch=gc;while(ch!='C' && ch!='Q')ch=gc;return ch;}
il void ad(ri x,ri y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x]};head[x]=ed_cnt;}
;fa[x]=fat;e(i,x)if(t(i)^fat){dfs1(t(i),x),sz[x]+=sz[t(i)];if(sz[t(i)]>sz[sn[x]] || !sz[x])sn[x]=t(i);}}
void dfs2(ri x,ri tp)
{
    top[x]=tp;rk[dfn[x]=low[x]=++dfn_cnt]=x;if(sn[x])dfs2(sn[x],tp);low[x]=max(low[x],low[sn[x]]);
    e(i,x)if(t(i)^fa[x] && t(i)^sn[x])dfs2(t(i),t(i)),low[x]=low[t(i)];
}
il void pushdown(ri x,ri l,ri r)
{
    if(tr[x].tag)
    {
        ri mid=(l+r)>>;
        tr[ls(x)].tag+=tr[x].tag;tr[ls(x)].dat+=tr[x].tag*(mid-l+);
        tr[rs(x)].tag+=tr[x].tag;tr[rs(x)].dat+=tr[x].tag*(r-mid);
        tr[x].tag=;
    }
}
il void pushup(ri x){tr[x].dat=tr[ls(x)].dat+tr[rs(x)].dat;}
void build(ri x,ri l,ri r)
{
    if(l==r){tr[x].dat=val[rk[l]];return;}
    ri mid=(l+r)>>;
    build(ls(x),l,mid);build(rs(x),mid+,r);
    pushup(x);
}
void modify(ri x,ri l,ri r,ri to_l,ri to_r,ri dat)
{
    );return;}
    pushdown(x,l,r);
    ri mid=(l+r)>>;
    if(mid>=to_l)modify(ls(x),l,mid,to_l,to_r,dat);
    ,r,to_l,to_r,dat);
    pushup(x);
}
int query(ri x,ri l,ri r,ri to_l,ri to_r)
{
    ;
    if(to_l<=l && r<=to_r)return tr[x].dat;
    pushdown(x,l,r);
    ri mid=(l+r)>>,ret=;
    if(mid>=to_l)ret+=query(ls(x),l,mid,to_l,to_r);
    ,r,to_l,to_r);
    return ret;
}
il ,,n,dfn[x],dfn[x],dat);}
il ,,n,dfn[x],low[x],dat);}
il ;,,n,dfn[top[x]],dfn[x]),x=fa[top[x]];return ret;}

main()
{
//    freopen("3178.in","r",stdin);freopen("3178.out","w",stdout);
    n=read();q=read();rp(i,,n)val[i]=read();rp(i,,n-){ri x=read(),y=read();ad(x,y);}dfs1(,);dfs2(,);build(,,n);
    while(q--)
    {
        ri op=read();
        switch(op)
        {
        :{ri x=read(),a=read();modify_pre_sig(x,a);break;}
        :{ri x=read(),a=read();modify_pre(x,a);break;}
        :{ri x=read();printf("%lld\n",query_pre(x));break;}
        }
    }
    ;
}

只会做做小水题安慰下自己了QAQ

洛谷P3178 树上操作 [HAOI2015] 树链剖分的更多相关文章

  1. Luogu P3178 树上操作(树链剖分+线段树)

    题意 见原题 题解 重链剖分模板题 #include <cstdio> #include <algorithm> using std::swap; typedef long l ...

  2. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  3. 洛谷p3384【模板】树链剖分题解

    洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...

  4. 洛谷P3178 [HAOI2015]树上操作 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P3178 这道题目是一道树链剖分的模板题. 但是在解决这道问题的同事刷新了我的两个认识: 第一个认识是:树链剖分不光可以处理链, ...

  5. [HAOI2015]树上操作(树链剖分)

    [HAOI2015]树上操作(luogu) Description 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增 ...

  6. BZOJ_4034 [HAOI2015]树上操作 【树链剖分dfs序+线段树】

    一 题目 [HAOI2015]树上操作 二 分析 树链剖分的题,这里主要用到了$dfs$序,这题比较简单的就是不用求$lca$. 1.和树链剖分一样,先用邻接链表建双向图. 2.跑两遍$dfs$,其实 ...

  7. 【HAOI2015】树上操作(树链剖分)

    题面 Description 有一棵点数为N的树,以点1为根,且树点有边权.然后有M个操作,分为三种: 操作1:把某个节点x的点权增加a. 操作2:把某个节点x为根的子树中所有点的点权都增加a. 操作 ...

  8. BZOJ 4034 [HAOI2015]树上操作(树链剖分)

    题目链接  BZOJ4034 这道题树链剖分其实就可以了. 单点更新没问题. 相当于更新 [f[x], f[x]]这个区间. f[x]表示树链剖分之后每个点的新的标号. 区间更新的话类似DFS序,求出 ...

  9. 洛谷 P3384 【模板】树链剖分

    树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...

随机推荐

  1. MySQL 支持的数据类型

    1.数值类型 MySQL 支持所有标准 SQL 中的数值类型,其中包括严格数值类型(integer.smallint.decimal.numeric),以及近似数值数据类型(float.real.do ...

  2. linux内核剖析(十)进程间通信之-信号量semaphore

    信号量 什么是信号量 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有. 信号量的值为正的时候,说明它空闲.所测试的线程可以锁定而使用它.若为0,说明它被占用,测试的线 ...

  3. Nginx Web服务应用

    Nginx 指令目录 Nginx 介绍 Nginx 编译安装 Nginx 功能模块 Nginx 目录结构 Nginx 配置文件 Nginx 虚拟主机配置 Nginx 状态信息功能配置 Nginx 错误 ...

  4. 在Python中定义和使用抽象类的方法

    https://www.jb51.net/article/87710.htm 像java一样python也可以定义一个抽象类. 在讲抽象类之前,先说下抽象方法的实现. 抽象方法是基类中定义的方法,但却 ...

  5. [MySQL Reference Manual]17 Group Replication

    17 Group Replication 17 Group Replication 17.1 Group Replication后台 17.1.1 Replication技术 17.1.1.1 主从复 ...

  6. Hadoop相关基础知识

    因为个人对这块的知识也不熟悉,所以大多内容来源于网络. 1.      Hadoop项目框架 2.      Hadoop Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以 ...

  7. vue 版本升级配置修改

  8. DR、BDR、SBR、ASBR等名词的解释和原理

    DR是指定路由器的意思是为了解决LSA在一个area里浪费很大的带宽而设计的 BDR是备份指定路由器,就是DR的一个备用.DR和BDR只在广播网和NBMA网络中有,而P2P和P2MP中是没有的. AB ...

  9. AssetManager

    AssetManager用于获取assets下的资源. 1.getassets()得到AssetManager 2.AssetManager.close() 关闭AssetManager 3.Reso ...

  10. Linux i2c子系统(二) _通过i2c-dev.c访问设备的方法

    另外一种驱动 应用层除了使用上述的使用i2c_driver接口来访问i2c设备,Linux内核还提供了一种简单粗暴的方式--直接通过虚拟i2c设备驱动的方式,即上一篇中的i2c-dev提供的方式,这种 ...