【SHOI2012】魔法树

题面

BZOJ上找不到这道题目

只有洛谷上有。。

所以粘贴洛谷的题面

题解

树链剖分之后直接维护线段树就可以了

树链剖分良心模板题

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. using namespace std;
  8. #define MAX 110000
  9. #define lson (now<<1)
  10. #define rson (now<<1|1)
  11. #define ll long long
  12. inline int read()
  13. {
  14. register int x=0,t=1;
  15. register char ch=getchar();
  16. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  17. if(ch=='-'){t=-1;ch=getchar();}
  18. while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
  19. return x*t;
  20. }
  21. struct Node
  22. {
  23. long long s;
  24. long long ly;
  25. }t[MAX<<2];
  26. int tim;
  27. struct Line
  28. {
  29. int v,next;
  30. }e[MAX];
  31. int h[MAX],cnt=1;
  32. int dfn[MAX],low[MAX],dep[MAX],ff[MAX],size[MAX],hson[MAX],top[MAX];
  33. int line[MAX],N;
  34. inline void Add(int u,int v)
  35. {
  36. e[cnt]=(Line){v,h[u]};
  37. h[u]=cnt++;
  38. }
  39. void DFS1(int u)
  40. {
  41. dep[u]=dep[ff[u]]+1;size[u]=1;
  42. for(int i=h[u];i;i=e[i].next)
  43. {
  44. int v=e[i].v;
  45. DFS1(v);
  46. if(size[v]>size[hson[u]])hson[u]=v;
  47. size[u]+=size[v];
  48. }
  49. }
  50. void DFS2(int u,int tp)
  51. {
  52. top[u]=tp;dfn[u]=++tim;line[tim]=u;
  53. if(hson[u])DFS2(hson[u],tp);
  54. for(int i=h[u];i;i=e[i].next)
  55. {
  56. int v=e[i].v;
  57. if(v==hson[u])continue;
  58. DFS2(v,v);
  59. }
  60. low[u]=tim;
  61. }
  62. void pushup(int now)
  63. {
  64. t[now].s=t[lson].s+t[rson].s;
  65. }
  66. void putlazy(int now,int ly,int l,int r)
  67. {
  68. t[now].s+=1LL*(r-l+1)*ly;
  69. t[now].ly+=ly;
  70. }
  71. void pushdown(int now,int l,int r)
  72. {
  73. int mid=(l+r)>>1;
  74. putlazy(lson,t[now].ly,l,mid);
  75. putlazy(rson,t[now].ly,mid+1,r);
  76. t[now].ly=0;
  77. }
  78. void Modify(int now,int l,int r,int al,int ar,int d)
  79. {
  80. if(l==al&&r==ar){putlazy(now,d,l,r);return;}
  81. int mid=(l+r)>>1;
  82. t[now].s+=1LL*(ar-al+1)*d;
  83. if(ar<=mid)Modify(lson,l,mid,al,ar,d);
  84. else if(al>mid)Modify(rson,mid+1,r,al,ar,d);
  85. else {Modify(lson,l,mid,al,mid,d);Modify(rson,mid+1,r,mid+1,ar,d);}
  86. }
  87. ll Query(int now,int l,int r,int al,int ar)
  88. {
  89. if(l==al&&r==ar)return t[now].s;
  90. int mid=(l+r)>>1;
  91. pushdown(now,l,r);
  92. ll re=0;
  93. if(ar<=mid)re=Query(lson,l,mid,al,ar);
  94. else if(al>mid)re=Query(rson,mid+1,r,al,ar);
  95. else re=Query(lson,l,mid,al,mid)+Query(rson,mid+1,r,mid+1,ar);
  96. pushup(now);
  97. return re;
  98. }
  99. void LCA(int u,int v,int d)
  100. {
  101. while(top[u]!=top[v])
  102. {
  103. if(dep[top[u]]<dep[top[v]])swap(u,v);
  104. Modify(1,1,N,dfn[top[u]],dfn[u],d);
  105. u=ff[top[u]];
  106. }
  107. if(dep[v]>dep[u])swap(u,v);
  108. Modify(1,1,N,dfn[v],dfn[u],d);
  109. }
  110. int main()
  111. {
  112. N=read();
  113. for(int i=1;i<N;++i)
  114. {
  115. int x=read()+1,y=read()+1;
  116. ff[y]=x;
  117. Add(x,y);
  118. }
  119. DFS1(1);DFS2(1,1);
  120. int Q=read();
  121. while(Q--)
  122. {
  123. char ch[3];scanf("%s",ch);
  124. if(ch[0]=='A')
  125. {
  126. int u=read()+1,v=read()+1,d=read();
  127. LCA(u,v,d);
  128. }
  129. else
  130. {
  131. int u=read()+1;
  132. printf("%lld\n",Query(1,1,N,dfn[u],low[u]));
  133. }
  134. }
  135. return 0;
  136. }

【SHOI2012】魔法树(树链剖分,线段树)的更多相关文章

  1. B20J_2836_魔法树_树链剖分+线段树

    B20J_2836_魔法树_树链剖分+线段树 题意: 果树共有N个节点,其中节点0是根节点,每个节点u的父亲记为fa[u].初始时,这个果树的每个节点上都没有果子(即0个果子). Add u v d ...

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

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

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

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

  4. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  5. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  6. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  7. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

  8. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  9. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

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

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

随机推荐

  1. Struts2 中添加 Servlet

    Struts2中如何添加Servlet 以前Java开发都是Servlet的天下,如今是各种框架横行,遇到一个需要将以前的Servlet加入到现有的Struts2的环境中. Google之后发现Sta ...

  2. js处理json js递归

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  3. Ubuntu16.04解决无法切换root权限的问题

    在su root时发现无法切换到root权限.显示: /usr/local/bin/zsh 没有文件或目录 想了想问题所在,突然想起来前段时间想要更换shell主题,于是装了zsh和oh-my-zsh ...

  4. 浅显总结ASCII Unicode UTF-8的区别

    如果觉得此地排版不好,欢迎访问我的博客 浅显总结ASCII Unicode UTF-8的区别 制作表单时,为了追求更好的用户交互体验,常常会有提示性的内容,比如提醒用户字符的限制.由于英文,中文字符的 ...

  5. Oracle创建表时Storage参数具体含义

    本文通过图表和实例的阐述在Oracle数据库创建新表时Storage的参数具体含义. 可用于:表空间.回滚段.表.索引.分区.快照.快照日志 参数名称 缺省值 最小值 最大值 说明 INITIAL 5 ...

  6. Java经典编程题50道之四

    将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. public class Example04 {    public static void main(String[] args ...

  7. bcache的使用

    一.前提:内核中需要配置bcache模块 1.1 检查 - 是否存在于内核中:检查/sys/fs/bcache目录是否存在,没有说明内核中没有bcache - 是否以内核模块方式存在:检查/lib/m ...

  8. 树莓派系列教程:1.环境与系统,无显示器无键盘无网线联网并使用PuTTy与VNC图形界面远程登录

    本文所需物品清单: Raspberry Pi 3 Model B 主板.SD卡与读卡器(用于烧录系统) 资料整理来源在文尾 需要下载的资源与工具: 推荐系统-Raspbian 树莓派官方深度定制的硬件 ...

  9. MysqL读写分离的实现-Mysql proxy中间件的使用

    为什么要架设读写分离,这里不做多余的说明,想了解具体原理,请百度或者参考其他帖子.在这里只做大概的配置说明,测试中使用三台服务器 192.168.136.142   主服务器 192.168.136. ...

  10. EmguCV 绘画图形

    1.Image类中绘图常用函数列表 实践验证 ///初始化图片 private void Form1_Load(object sender, EventArgs e) { oldpic = new E ...