1、题目大意:用一个数据结构支持树的点修改和子树修改、树上路径和

2、分析:树链剖分裸题

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 1000000
#define LL long long
LL Size[M], value[M], Top[M], Fa[M], Height[M], num[M], left[M], right[M];
LL tot, ST_tot;
LL son[M], head[M], Next[M];
LL n, m;
LL q[M], lazy[M];
void init(){
    memset(head, -1, sizeof(head));
    memset(lazy, 0, sizeof(lazy));
    tot = ST_tot = 0;
    Top[1] = 1;
}
void pushdown(LL l, LL r, LL o){
    LL mid = (l + r) / 2;
    q[2 * o] += (mid + 1 - l) * lazy[o];
    q[2 * o + 1] += (r - mid) * lazy[o];
    lazy[2 * o] += lazy[o];
    lazy[2 * o + 1] += lazy[o];
    lazy[o] = 0;
}
void add(LL l, LL r, LL o, LL x, LL y, LL z){
    if(x <= l && r <= y){
        lazy[o] += z;
        q[o] += (r - l + 1) * z;
        return;
    }
    pushdown(l, r, o);
    LL mid = (l + r) / 2;
    if(x <= mid) add(l, mid, 2 * o, x, y, z);
    if(y > mid) add(mid + 1, r, 2 * o + 1, x, y, z);
    q[o] = q[2 * o] + q[2 * o + 1];
}
LL query(LL l, LL r, LL o, LL x, LL y){
    if(x <= l && r <= y) return q[o];
    pushdown(l, r, o);
    LL mid = (l + r) / 2, ret = 0;
    if(x <= mid) ret += query(l, mid, 2 * o, x, y);
    if(y > mid) ret += query(mid + 1, r, 2 * o + 1, x, y);
    return ret;
}
void insert(LL x, LL y){
    tot ++;
    son[tot] = y;
    Next[tot] = head[x];
    head[x] = tot;
}
void dfs1(LL x, LL fa, LL height){
    Fa[x] = fa;
    Height[x] = height;
    Size[x] = 1;
    for(LL i = head[x]; i != -1; i = Next[i]) if(son[i] != fa){
        dfs1(son[i], x, height + 1);
        Size[x] += Size[son[i]];
    }
}
void dfs2(LL x, LL fa){
    ++ ST_tot;
    left[x] = ST_tot;
    num[x] = ST_tot;
    add(1, n, 1, ST_tot, ST_tot, value[x]);
    LL o = 0, ss = 0;
    for(LL i = head[x]; i != -1; i = Next[i]) if(son[i] != fa){
        if(Size[son[i]] > ss){
            ss = Size[son[i]];
            o = i;
        }
    }
    if(o != 0){
        Top[son[o]] = Top[x];
        dfs2(son[o], x);
    }
    for(LL i = head[x]; i != -1; i = Next[i]) if(son[i] != fa && o != i){
        Top[son[i]] = son[i];
        dfs2(son[i], x);
    }
    right[x] = ST_tot;
}
void real_add(LL x, LL y){
    add(1, n, 1, left[x], right[x], y);
}
void real_add1(LL x, LL y){
    add(1, n, 1, num[x], num[x], y);
}
LL real_query(LL x){
    LL y = 1;
    LL ret = 0;
    while(Top[x] != Top[y]){
        if(Height[Top[x]] < Height[Top[y]]) swap(x, y);
        ret += query(1, n, 1, num[Top[x]], num[x]);
        x = Fa[Top[x]];
    }
    if(Height[x] < Height[y]) swap(x, y);
    ret += query(1, n, 1, num[y], num[x]);
    return ret;
}
int main(){
    scanf("%lld%lld", &n, &m);
    for(LL i = 1; i <= n; i ++) scanf("%lld", &value[i]);
    init();
    for(LL i = 1; i < n; i ++){
        LL x, y;
        scanf("%lld%lld", &x, &y);
        insert(x, y);
        insert(y, x);
    }
    dfs1(1, 0, 1);
    dfs2(1, 0);
    for(LL i = 1; i <= m; i ++){
        LL op, x, a;
        scanf("%lld", &op);
        if(op == 1){
            scanf("%lld%lld", &x, &a);
            real_add1(x, a);
        }
        else if(op == 2){
            scanf("%lld%lld", &x, &a);
            real_add(x, a);
        }
        else{
            scanf("%lld", &x);
            printf("%lld\n", real_query(x));
        }
    }
    return 0;
}

BZOJ4034——[HAOI2015]T2的更多相关文章

  1. bzoj4034: [HAOI2015]T2

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 2684  Solved: 843 Description 有一 ...

  2. [BZOJ4034] [HAOI2015] T2 (树链剖分)

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

  3. 【DFS序】【线段树】bzoj4034 [HAOI2015]T2

    分开维护树的入栈序和出栈序,用两棵线段树.回答时就是用一颗的减去另一棵的. #include<cstdio> #include<algorithm> using namespa ...

  4. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  5. Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1841  Solved: 598[Submit][Status] ...

  6. BZOJ 4034: [HAOI2015]T2( 树链剖分 )

    树链剖分...子树的树链剖分序必定是一段区间 , 先记录一下就好了 ------------------------------------------------------------------ ...

  7. bzoj 4034: [HAOI2015]T2

    4034: [HAOI2015]T2 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操 ...

  8. 【bzoj4034】[HAOI2015]T2

    siz[v]表示以v为根的子树的节点数 top[v]表示v所在的重链的顶端节点 fa[v]表示v的父亲 pos[v]表示v的父边标号 mx[v]表示v的子树中边的标号最大的那条边 参考:http:// ...

  9. 数据结构(树链剖分):BZOJ 4034: [HAOI2015]T2

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

随机推荐

  1. Struts2(一)入门及工作原理

    Apache Struts 2 是一种流行的 Java模型 - 视图 - 控制器(MVC)框架,成功地结合了 WebWork和Struts1.x 两种 web 框架. Apache Struts2与S ...

  2. Django中Celery的实现介绍(一)

    Django中Celery的实现 Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Cele ...

  3. Eclipse自动补全+常用快捷键

    一,Eclipse自动补全增强方法 在Eclipse中,从Window -> preferences -> Java -> Editor -> Content assist - ...

  4. C#--网络流Stream、字节数组保存到字符串中

    第一种方法: HttpWebRequest httpwebr = (HttpWebRequest)HttpWebRequest.Create(rstr); httpwebr.Method = &quo ...

  5. CodeLite的姿势

    在Mac上安装cscope 1.下载cscope的Zip压缩包 2.解压 3.打开终端,进入解压目录,运行 ./configure make make install 4.在CodeLite中,在Pl ...

  6. MSSQL数据库链接字符串Asynchronous Processing=true不是异步查询吗,怎么是缓存

    ;Asynchronous Processing=true  不是异步查询吗,怎么是缓存 <!--<add name="default" providerName=&q ...

  7. Java多线程编程核心技术---线程间通信(一)

    线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...

  8. Block 及注意事项

    block 概念 block 是 C 语言的 是一种数据类型,可以当作参数传递 是一组预先准备好的代码,在需要的时候执行 block 的注意事项 (1)block 在实现时就会对它引用到的它所在方法中 ...

  9. 再说vim的tab设置

    首先, vim的设置允许简写 // 单击一次tab,停靠, 停止在 4个spaces距离处 set tabstop=4 , 可以简写为: set ts=4 // 允许将tab转换为空格 turn ta ...

  10. Subversion命令汇总

    转自:http://www.cnblogs.com/cnblogsfans/archive/2010/03/21/1690838.html svn 命令共同的选项 --targets list 读取l ...