1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M=3e5+;
  4. struct node{
  5. int l,r,cnt,lazy;
  6. node(int l1=,int r1=,int cnt1=,int lazy1=):l(l1),r(r1),cnt(cnt1),lazy(lazy1){}
  7. }tree[M<<];
  8. int fa[M],sz[M],deep[M],dfn[M],son[M],to[M],a[M],top[M],cnt,n;
  9. char s[];
  10. vector<int>g[M];
  11. void dfs1(int u,int from){
  12. fa[u]=from;
  13. sz[u]=;
  14. deep[u]=deep[from]+;
  15. for(int i=;i<g[u].size();i++){
  16.  
  17. int v=g[u][i];
  18. if(v!=from){
  19. dfs1(v,u);
  20. sz[u]+=sz[v];
  21. if(sz[v]>sz[son[u]])
  22. son[u]=v;
  23. }
  24.  
  25. }
  26. }
  27. void dfs2(int u,int t){
  28. top[u]=t;
  29. dfn[u]=++cnt;
  30. to[cnt]=u;
  31. if(!son[u])
  32. return ;
  33. dfs2(son[u],t);
  34. for(int i=;i<g[u].size();i++){
  35. int v=g[u][i];
  36. if(v!=fa[u]&&v!=son[u])
  37. dfs2(v,v);
  38. }
  39. }
  40. void up(int root){
  41. tree[root].cnt=tree[root<<].cnt+tree[root<<|].cnt;
  42. if(tree[root<<].r==tree[root<<|].l)
  43. tree[root].cnt--;
  44. tree[root].l=tree[root<<].l;
  45. tree[root].r=tree[root<<|].r;
  46. }
  47. void build(int root,int l,int r){
  48. tree[root].lazy=;
  49. if(l==r){
  50. tree[root].l=tree[root].r=a[to[l]];
  51. tree[root].cnt=;
  52. return ;
  53. }
  54. int midd=(l+r)>>;
  55. build(root<<,l,midd);
  56. build(root<<|,midd+,r);
  57. up(root);
  58. }
  59. void pushdown(int root){
  60. tree[root<<]=tree[root<<|]=node(tree[root].l,tree[root].r,,tree[root].lazy);
  61. tree[root].lazy=;
  62. }
  63. void update(int L,int R,int x,int root,int l,int r){
  64. if(L<=l&&r<=R){
  65. tree[root]=node(x,x,,x);
  66. return ;
  67. }
  68. if(tree[root].lazy)
  69. pushdown(root);
  70. int midd=(l+r)>>;
  71. if(L<=midd)
  72. update(L,R,x,root<<,l,midd);
  73. if(R>midd)
  74. update(L,R,x,root<<|,midd+,r);
  75. up(root);
  76. }
  77. void add(int u,int v ,int w){
  78. int fu=top[u],fv=top[v];
  79. while(fu!=fv){
  80. if(deep[fu]>=deep[fv])
  81. update(dfn[fu],dfn[u],w,,,n),u=fa[fu],fu=top[u];
  82. else
  83. update(dfn[fv],dfn[v],w,,,n),v=fa[fv],fv=top[v];
  84. }
  85. if(dfn[u]<=dfn[v])
  86. update(dfn[u],dfn[v],w,,,n);
  87. else
  88. update(dfn[v],dfn[u],w,,,n);
  89. }
  90. node meger(node a,node b){
  91. if(!a.cnt)
  92. return b;
  93. if(!b.cnt)
  94. return a;
  95. node ans=node(,,,);
  96. ans.cnt=a.cnt+b.cnt;
  97. if(a.r==b.l)
  98. ans.cnt--;
  99. ans.l=a.l;
  100. ans.r=b.r;
  101. return ans;
  102. }
  103. node query(int L,int R,int root,int l,int r){
  104. if(L<=l&&r<=R){
  105. return tree[root];
  106. }
  107. if(tree[root].lazy)
  108. pushdown(root);
  109. int midd=(l+r)>>;
  110. node ans;
  111. if(L<=midd)
  112. ans=query(L,R,root<<,l,midd);
  113. if(R>midd)
  114. ans=meger(ans,query(L,R,root<<|,midd+,r));
  115. up(root);
  116. return ans;
  117. }
  118. int solve(int u,int v){
  119. node l,r;
  120. int fv=top[v],fu=top[u];
  121. while(fv!=fu){
  122. if(deep[fu]>=deep[fv])
  123. l=meger(query(dfn[fu],dfn[u],,,n),l),u=fa[fu],fu=top[u];
  124. else
  125. r=meger(query(dfn[fv],dfn[v],,,n),r),v=fa[fv],fv=top[v];
  126. }
  127. if(dfn[u]<=dfn[v])
  128. r=meger(query(dfn[u],dfn[v],,,n),r);
  129. else
  130. l=meger(query(dfn[v],dfn[u],,,n),l);
  131. swap(l.l,l.r);
  132. l=meger(l,r);
  133. return l.cnt;
  134. }
  135. int main(){
  136. int m;
  137. scanf("%d%d",&n,&m);
  138. for(int i=;i<=n;i++)
  139. scanf("%d",&a[i]);
  140. for(int i=;i<n;i++){
  141. int u,v;
  142. scanf("%d%d",&u,&v);
  143. g[u].push_back(v);
  144. g[v].push_back(u);
  145. }//cout<<"!!"<<endl;
  146. dfs1(,);
  147. dfs2(,);
  148.  
  149. build(,,n);
  150. while(m--){
  151. int u,v,w;
  152. scanf("%s",s);
  153. if(s[]=='Q'){
  154. scanf("%d%d",&u,&v);
  155. printf("%d\n",solve(u,v));
  156. }
  157. else{
  158. scanf("%d%d%d",&u,&v,&w);
  159. add(u,v,w);
  160. }
  161. }
  162. return ;
  163. }

P2486 [SDOI2011]染色 区间合并+树链剖分(加深对线段树的理解)的更多相关文章

  1. BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  2. BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector

    题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...

  3. HDU 5029 Relief grain 树链剖分打标记 线段树区间最大值

    Relief grain Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  4. LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】

    题目分析: 好题.本来是一道好的非套路题,但是不凑巧的是当年有一位国家集训队员正好介绍了这个算法. 首先考虑静态的情况.这个的DP方程非常容易写出来. 接着可以注意到对于异或结果的计数可以看成一个FW ...

  5. [GDOI2016] 疯狂动物园 [树链剖分+可持久化线段树]

    题面 太长了,而且解释的不清楚,我来给个简化版的题意: 给定一棵$n$个点的数,每个点有点权,你需要实现以下$m$个操作 操作1,把$x$到$y$的路径上的所有点的权值都加上$delta$,并且更新一 ...

  6. HYSBZ 4034 【树链剖分】+【线段树 】

    <题目链接> 题目大意: 有一棵点数为 N 的树,以点 1 为根,且树点有权值.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x ...

  7. HDU 3966 Aragorn's Story(模板题)【树链剖分】+【线段树】

    <题目链接> 题目大意: 给定一颗带点权的树,进行两种操作,一是给定树上一段路径,对其上每个点的点权增加或者减少一个数,二是对某个编号点的点权进行查询. 解题分析: 树链剖分的模板题,还不 ...

  8. 焦作网络赛E-JiuYuanWantstoEat【树链剖分】【线段树】

    You ye Jiu yuan is the daughter of the Great GOD Emancipator. And when she becomes an adult, she wil ...

  9. 【树链剖分】【线段树】bzoj3626 [LNOI2014]LCA

    引用题解: http://blog.csdn.net/popoqqq/article/details/38823457 题目大意: 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深 ...

  10. 【Codeforces】【网络流】【树链剖分】【线段树】ALT (CodeForces - 786E)

    题意 现在有m个人,每一个人都特别喜欢狗.另外还有一棵n个节点的树. 现在每个人都想要从树上的某个节点走到另外一个节点,且满足要么这个人自带一条狗m,要么他经过的所有边h上都有一条狗. 2<=n ...

随机推荐

  1. 阿里P7Java最全面试296题:阿里天猫、蚂蚁金服含答案文档解析

    [阿里天猫.蚂蚁.钉钉面试专题题目加答案] 不会做别着急:文末有答案以及视频讲解,架构师资料 1. junit用法,before,beforeClass,after, afterClass的执行顺序 ...

  2. javacv 设置帧率(续)

    前文地址:https://www.cnblogs.com/svenwu/p/9663038.html 前文已经对大多数正常情况可以支持了,但是我最近处理一些公司的视频流,发现一些坑爹的情况 每次给的视 ...

  3. pipeline简单规则

    Declarative 1. pipeline{ agent options{ } stages{ stage(' '){ steps{ } } } post{ always{} changed{} ...

  4. UVA 12663 第九届省赛 高桥与低桥 线段树

    题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次 看下数据10的五次方,10的五次方 ...

  5. 吴裕雄--天生自然MySQL学习笔记:MySQL DELETE 语句

    可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录. 可以在 mysql> 命令提示符或 PHP 脚本中执行该命令. 语法 以下是 SQL DELETE 语句从 ...

  6. 吴裕雄--天生自然 JAVASCRIPT开发学习:Array(数组) 对象

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. one_day_one_linuxCmd---netstat命令

    <坚持每天学习一个 linux 命令,今天我们来学习 netstat 命令> 前言:netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态等,还可以很方便查看本地机器上 ...

  8. C语言-再论指针与数组

    指针与数组的天生姻缘1.以指针方式来访问数组元素(1).数组元素使用时不能整体访问,只能是单个访问.访问形式有两种:数组形式和指针形式.(2).数组形式访问数组元素:数组名[下标]:(下标从0开始(3 ...

  9. 微信小程序官方示例 官方weui-wxss下载于安装 详解

    1.小程序示例源码:https://github.com/wechat-miniprogram/miniprogram-demo 2.微信 weui下载地址:https://github.com/we ...

  10. Python合成GIF图片 -- imageio库

    pip install imageio import imageio # 需要合在一起的图片 image_list = [r'C:\Users\Hlzy\Desktop\\' + str(x) + & ...