题意:给出一颗树形图,有三种操作,I:在u到v的路径上的每个点的权值+d,D:在u到v的路径上的每个点的权值都-d,Q询问u点的权值

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include"stdio.h"
  3. #include"string.h"
  4. #include"stdlib.h"
  5. #include"algorithm"
  6. #include"math.h"
  7. #include"vector"
  8. #include"queue"
  9. #include"map"
  10. #include"string"
  11. #define M 100009
  12. #define Maxm 10000
  13. #define inf 1000000000
  14. #define eps 1e-7
  15. #define pps 1e-18
  16. #define PI acos(-1.0)
  17. #define LL __int64
  18. using namespace std;
  19. struct node
  20. {
  21. int u,v,next;
  22. }edge[M*2];
  23. int t,head[M],son[M],num[M],p[M],fa[M],fp[M],deep[M],value[M],pos,top[M];
  24. void init()
  25. {
  26. t=pos=0;
  27. memset(head,-1,sizeof(head));
  28. memset(son,-1,sizeof(son));
  29. }
  30. void add(int u,int v)
  31. {
  32. edge[t].u=u;
  33. edge[t].v=v;
  34. edge[t].next=head[u];
  35. head[u]=t++;
  36. }
  37. void dfs(int u,int f,int d)
  38. {
  39. deep[u]=d;
  40. num[u]=1;
  41. fa[u]=f;
  42. for(int i=head[u];~i;i=edge[i].next)
  43. {
  44. int v=edge[i].v;
  45. if(v!=f)
  46. {
  47. dfs(v,u,d+1);
  48. num[u]+=num[v];
  49. if(son[u]==-1||num[v]>num[son[u]])
  50. son[u]=v;
  51. }
  52. }
  53. }
  54. void getpos(int u,int sp)
  55. {
  56. top[u]=sp;
  57. p[u]=++pos;
  58. fp[p[u]]=u;
  59. if(son[u]==-1)return;
  60. getpos(son[u],sp);
  61. for(int i=head[u];i!=-1;i=edge[i].next)
  62. {
  63. int v=edge[i].v;
  64. if(v!=fa[u]&&v!=son[u])
  65. getpos(v,v);
  66. }
  67. }
  68. struct Tree
  69. {
  70. int l,r,add,flag;
  71. }tree[M*4];
  72. void push(int i)
  73. {
  74. if(tree[i].l==tree[i].r)return;
  75. if(tree[i].flag)
  76. {
  77. tree[i<<1].add+=tree[i].add;
  78. tree[i<<1].flag=1;
  79. tree[i<<1|1].add+=tree[i].add;
  80. tree[i<<1|1].flag=1;
  81. tree[i].flag=tree[i].add=0;
  82. }
  83. }
  84. void make(int l,int r,int i)
  85. {
  86. tree[i].l=l;
  87. tree[i].r=r;
  88. tree[i].flag=1;
  89. tree[i].add=0;
  90. if(l==r)
  91. return;
  92. int mid=(l+r)>>1;
  93. make(l,mid,i<<1);
  94. make(mid+1,r,i<<1|1);
  95. }
  96. void updata(int l,int r,int i,int k)
  97. {
  98. if(tree[i].l==l&&tree[i].r==r)
  99. {
  100. tree[i].add+=k;
  101. tree[i].flag=1;
  102. return;
  103. }
  104. push(i);
  105. int mid=(tree[i].l+tree[i].r)>>1;
  106. if(r<=mid)
  107. updata(l,r,i<<1,k);
  108. else if(l>mid)
  109. updata(l,r,i<<1|1,k);
  110. else
  111. {
  112. updata(l,mid,i<<1,k);
  113. updata(mid+1,r,i<<1|1,k);
  114. }
  115. }
  116. int query(int q,int i)
  117. {
  118. if(tree[i].l==q&&tree[i].r==q)
  119. return tree[i].add;
  120. push(i);
  121. int mid=(tree[i].l+tree[i].r)>>1;
  122. if(q<=mid)
  123. return query(q,i<<1);
  124. else
  125. return query(q,i<<1|1);
  126. }
  127. void lcp(int u,int v,int k)
  128. {
  129. int f1=top[u];
  130. int f2=top[v];
  131. while(f1!=f2)
  132. {
  133. if(deep[f1]<deep[f2])
  134. {
  135. swap(f1,f2);
  136. swap(u,v);
  137. }
  138. updata(p[f1],p[u],1,k);
  139. u=fa[f1];
  140. f1=top[u];
  141. }
  142. if(deep[u]>deep[v])
  143. swap(u,v);
  144. updata(p[u],p[v],1,k);
  145. }
  146. int main()
  147. {
  148. int n,m,Q,i,u,v,d;
  149. char str[5];
  150. while(scanf("%d%d%d",&n,&m,&Q)!=EOF)
  151. {
  152. for(i=1;i<=n;i++)
  153. scanf("%d",&value[i]);
  154. init();
  155. for(i=1;i<=m;i++)
  156. {
  157. scanf("%d%d",&u,&v);
  158. add(u,v);
  159. add(v,u);
  160. }
  161. dfs(1,1,1);
  162. getpos(1,1);
  163. make(1,pos,1);
  164. while(Q--)
  165. {
  166. scanf("%s",str);
  167. if(str[0]=='I')
  168. {
  169. scanf("%d%d%d",&u,&v,&d);
  170. lcp(u,v,d);
  171. }
  172. else if(str[0]=='D')
  173. {
  174. scanf("%d%d%d",&u,&v,&d);
  175. lcp(u,v,-d);
  176. }
  177. else
  178. {
  179. scanf("%d",&u);
  180. printf("%d\n",value[u]+query(p[u],1));
  181. }
  182. }
  183. }
  184. return 0;
  185. }

树链剖分(线段树区间更新求和(lazy操作)hdu3966)的更多相关文章

  1. POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )

    POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...

  2. 【bzoj2325】[ZJOI2011]道馆之战 树链剖分+线段树区间合并

    题目描述 给定一棵树,每个节点有上下两个格子,每个格子的状态为能走或不能走.m次操作,每次修改一个节点的状态,或询问:把一条路径上的所有格子拼起来形成一个宽度为2的长方形,从起点端两个格子的任意一个开 ...

  3. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  4. Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组

    Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...

  5. 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 ...

  6. bzoj2243[SDOI2011]染色 树链剖分+线段树

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 9012  Solved: 3375[Submit][Status ...

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

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

  8. fzu 2082 过路费 (树链剖分+线段树 边权)

    Problem 2082 过路费 Accept: 887    Submit: 2881Time Limit: 1000 mSec    Memory Limit : 32768 KB  Proble ...

  9. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  10. 【bzoj1036】树的统计[ZJOI2008]树链剖分+线段树

    题目传送门:1036: [ZJOI2008]树的统计Count 这道题是我第一次打树剖的板子,虽然代码有点长,但是“打起来很爽”,而且整道题只花了不到1.5h+,还是一遍过样例!一次提交AC!(难道前 ...

随机推荐

  1. phpCAS::handleLogoutRequests()关于java端项目登出而php端项目检测不到的测试

    首先,假如你有做过cas,再假如你的cas里面有php项目,这个时候要让php项目拥有cas的sso功能,你需要改造你的项目,由于各人的项目不同,但是原理差不多,都是通过从cas服务器获取sessio ...

  2. MYSQL启动报1067错误,系统日志中是“服务 mysql 意外停止” Mysql日志中则是:“Plugin \'FEDERATED\' is disabled”

    MYSQL启动报1067错误,系统日志中是"服务 mysql 意外停止" Mysql日志中则是:"Plugin \'FEDERATED\' is disabled&quo ...

  3. SQL 编辑

    局部变量: DECLARE @variable_name Datatype Variable_naem为局部变量的名称,Datatype为数据名称. 例如: DECLARE @name varchar ...

  4. PHP实现QQ第三方登录

    PHP实现QQ第三方登录 学习之前,请大家先看一下oAuth协议. 首先呢,我们进入QQ互联的官方网站 http://connect.qq.com登入我们自己的QQ号,没有QQ号的小伙伴可以忽略本篇博 ...

  5. 【android学习2】:Eclipse中HttpServlet类找不到

    Eclipse中使用的HttpServlet类之所以识别不到的原因是没有导入Servlet-api.jar包,这个包在所安装在的tomcat的lib文件下,所以只需要导入即可. 在需要导入的工程上右键 ...

  6. django internal search

    最近改进了项目中的站内搜索的功能,增加了全文索引,提升了搜索速度.因为项目框架是django,所以采用django+haystack+pyelasticsearch+elasticsearch的方式实 ...

  7. CS6破解

    1) 序列号这里为大家生成了两个,可以通过软件验证:1325-0949-2080-9819-3777-32301325-0160-5283-9851-2671-8951 2) 破解补丁安装时会用到,请 ...

  8. PySe-001-基础环境配置(MacOX)

    Python 是一种面向对象.解释型计算机程序设计语言,其源代码同样遵循 GPL(GNU General Public License)协议.Python语法简洁而清晰,具有丰富和强大的类库.由于Py ...

  9. zero1--hibernate注解02

  10. 转载:如何运用VI编辑器进行查找替换

    使用vi编辑器编辑长文件时,常常是头昏眼花,也找不到需要更改的内容. 这时,使用查找功能尤为重要. 方法如下: 1.命令模式下输入“/字符串”,例如“/Section 3”. 2.如果查找下一个,按“ ...