思路:
链剖+线段树裸题

重链的标号就是DFS序

所以查子树的时候每回就 query(change[x],change[x]+size[x]-1)
就好了

剩下的应该都会吧。。

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
#define N 100050
char op[19];
int n,m,xx,yy,ww,first[N],next[N],v[N],tot,tree[N*16],mark[N*16];
int fa[N],rec[N],cnt,deep[N],size[N],son[N],top[N],p[N];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void dfs(int x){size[x]=1,son[x]=-1;for(int i=first[x];~i;i=next[i]){deep[v[i]]=deep[x]+1;dfs(v[i]);size[x]+=size[v[i]];if(son[x]==-1||size[v[i]]>size[son[x]])son[x]=v[i];}
}
void dfs2(int x,int tp){top[x]=tp,rec[x]=++cnt;if(~son[x])dfs2(son[x],tp);for(int i=first[x];~i;i=next[i]){if(v[i]!=son[x])dfs2(v[i],v[i]);}
}
void push_down(int pos,int cover){int lson=pos<<1,rson=pos<<1|1;mark[lson]+=mark[pos],mark[rson]+=mark[pos];tree[lson]+=(cover-cover/2)*mark[pos];tree[rson]+=cover/2*mark[pos];mark[pos]=0;
}
void insert(int l,int r,int pos,int L,int R,int wei){if(l>=L&&r<=R){tree[pos]+=wei*(r-l+1),mark[pos]+=wei;return;}if(mark[pos])push_down(pos,r-l+1);int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;if(mid<L)insert(mid+1,r,rson,L,R,wei);else if(mid>=R)insert(l,mid,lson,L,R,wei);else insert(l,mid,lson,L,R,wei),insert(mid+1,r,rson,L,R,wei);tree[pos]=tree[lson]+tree[rson];
}
void Add(int x,int y){int fx=top[x],fy=top[y];while(fx!=fy){if(deep[fx]<deep[fy])swap(x,y),swap(fx,fy);insert(1,n,1,rec[fx],rec[x],ww);x=fa[fx],fx=top[x];}if(deep[x]>deep[y])swap(x,y);insert(1,n,1,rec[x],rec[y],ww);
}
int query(int l,int r,int pos,int L,int R){if(l>=L&&r<=R)return tree[pos];if(mark[pos])push_down(pos,r-l+1);int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;if(mid<L)return query(mid+1,r,rson,L,R);else if(mid>=R)return query(l,mid,lson,L,R);else return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);
}
signed main(){memset(first,-1,sizeof(first));scanf("%lld",&n);for(int i=1;i<n;i++){scanf("%lld%lld",&xx,&yy);fa[yy]=xx,add(xx,yy);}dfs(0),dfs2(0,0);scanf("%lld",&m);for(int i=1;i<=m;i++){scanf("%s",op);if(op[0]=='A')scanf("%lld%lld%lld",&xx,&yy,&ww),Add(xx,yy);else scanf("%lld",&xx),printf("%lld\n",query(1,n,1,rec[xx],rec[xx]+size[xx]-1));}
}

转载于:https://www.cnblogs.com/SiriusRen/p/6532163.html

BZOJ 2836 树链剖分+线段树相关推荐

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1153  Solved: 421 [Submit][Sta ...

  2. BZOJ3862Little Devil I——树链剖分+线段树

    题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...

  3. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  4. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  5. P2486 [SDOI2011]染色(树链剖分+线段树)

    题干描述 输入描述 输出格式 对于每个询问操作,输出一行答案. 输入输出样例 输入 #1 复制 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C 2 1 1 Q ...

  6. BZOJ4127Abs——树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

  7. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  8. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  9. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  10. YbtOJ-染色计划【树链剖分,线段树,tarjan】

    正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai​,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...

最新文章

  1. 学好C++十大良好的习惯
  2. 在.NET中不安装Office使用EPPlus生成带图表(Chart)的Excel报表
  3. 洛谷 - P1308 统计单词数(字符串+模拟)
  4. 物联网数据终端演进之道
  5. 华为荣耀20计算机,华为云电脑将停止服务/荣耀新机保护壳曝光/小米新机渲染图曝光...
  6. Python弹窗提示警告框MessageBox
  7. Linux 如何隔离CPU核心 isolcpus=0-2
  8. java怎么新建模块_spring boot添加新模块的方法教程
  9. 如何使用TreeView控件
  10. 实验五 背包问题和带时限的作业排序
  11. html编写qq整人代码,vbs代码大全?vbs整人代码?qq代码大全?常用VBS代码 值得一看
  12. JavaScript实现输入框(密码框)出现提示语
  13. 解决Vscode提示code安装似乎损坏
  14. 华为服务器怎么查看系统日志,云服务器怎么查看系统日志
  15. 向量空间、内积空间、欧式空间以及希尔伯特空间的关系
  16. 【Red Team——基础】通过钓鱼攻击获得访问权限
  17. php 数组 批量替换字符串,php数组替换字符串
  18. go语言学习:语言简介
  19. html 内嵌iframe,html页面 内嵌iframe
  20. photoshop cs3 打字不显示问题

热门文章

  1. oracle DML错误日志(笔记)
  2. 【C/C++】变量的内存分配
  3. 【C】malloc(0)问题
  4. 文本前后空格去除工具
  5. 聊聊Elasticsearch的CachedSupplier
  6. CentOS 6.3下NFS安装配置
  7. 共享内存之——system V共享内存
  8. 86.最少连接算法以及如何跨worker进程生效
  9. 组装电脑配置单报价_怎么选择组装电脑?牢记这四点永不吃亏,第四点最重要...
  10. matlab 省略号,matlab知识集锦 | 学步园