模板题。。。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. #define N 30001
  6. #define INF 1000000000
  7. inline char Nc(){
  8. static char buf[],*p1=buf,*p2=buf;
  9. if(p1==p2){
  10. p2=(p1=buf)+fread(buf,,,stdin);
  11. if(p1==p2)return EOF;
  12. }
  13. return *p1++;
  14. }
  15. inline void Read(int& x){
  16. char c=Nc(),b=;
  17. for(;c<''||c>'';c=Nc())if(c=='-')b=-;
  18. for(x=;c>=''&&c<='';x=x*+c-,c=Nc());x*=b;
  19. }
  20. inline void Read(char* s){
  21. int i=;
  22. char c=Nc();
  23. while(c!=' ')s[i]=c,i++,c=Nc();
  24. }
  25. int Len;
  26. char s[];
  27. inline void Print(int x){
  28. if(x<){
  29. putchar('-');
  30. x=-x;
  31. }
  32. if(!x){
  33. putchar('');putchar('\n');
  34. return;
  35. }
  36. for(Len=;x;x/=)s[++Len]=x%;
  37. for(;Len;Len--)putchar(s[Len]+);
  38. putchar('\n');
  39. }
  40. struct Edge{
  41. int To,Next;
  42. }e[N<<];
  43. inline int _Max(int x,int y){
  44. return x>y?x:y;
  45. }
  46. int h[N],i,j,k,Num,n,m,T,a[N],w[N],x,y,w2[N],Top[N],Size[N],Son[N],f[N],Sum[N<<],Max[N<<],Deep[N];
  47. char S[];
  48. inline void Add(int x,int y){
  49. e[++Num].To=y;e[Num].Next=h[x];h[x]=Num;
  50. }
  51. void Dfs1(int x,int Fa){
  52. f[x]=Fa;Size[x]=;Deep[x]=Deep[Fa]+;
  53. for(int i=h[x];i;i=e[i].Next)
  54. if(e[i].To!=Fa){
  55. Dfs1(e[i].To,x);
  56. Size[x]+=Size[e[i].To];
  57. if(Size[e[i].To]>Size[Son[x]])Son[x]=e[i].To;
  58. }
  59. }
  60. void Dfs2(int x,int Tmp){
  61. w[x]=++m;w2[m]=x;Top[x]=Tmp;
  62. if(Son[x])Dfs2(Son[x],Tmp);
  63. for(int i=h[x];i;i=e[i].Next)
  64. if(e[i].To!=f[x]&&e[i].To!=Son[x])Dfs2(e[i].To,e[i].To);
  65. }
  66. void Build(int Node,int l,int r){
  67. if(l==r){
  68. Sum[Node]=Max[Node]=a[w2[l]];
  69. return;
  70. }
  71. int Mid=(l+r)>>;
  72. Build(Node<<,l,Mid);
  73. Build(Node<<|,Mid+,r);
  74. Sum[Node]=Sum[Node<<]+Sum[Node<<|];
  75. Max[Node]=_Max(Max[Node<<],Max[Node<<|]);
  76. }
  77. void Update(int Node,int l,int r,int x,int y){
  78. if(l==r){
  79. Sum[Node]=Max[Node]=y;
  80. return;
  81. }
  82. int Mid=(l+r)>>;
  83. if(x<=Mid)Update(Node<<,l,Mid,x,y);else Update(Node<<|,Mid+,r,x,y);
  84. Sum[Node]=Sum[Node<<]+Sum[Node<<|];
  85. Max[Node]=_Max(Max[Node<<],Max[Node<<|]);
  86. }
  87. int Querysum(int Node,int l,int r,int L,int R){
  88. if(l>R||r<L)return ;
  89. if(l>=L&&r<=R)return Sum[Node];
  90. int Mid=(l+r)>>;
  91. return Querysum(Node<<,l,Mid,L,R)+Querysum(Node<<|,Mid+,r,L,R);
  92. }
  93. int Querymax(int Node,int l,int r,int L,int R){
  94. if(l>R||r<L)return -INF;
  95. if(l>=L&&r<=R)return Max[Node];
  96. int Mid=(l+r)>>;
  97. return _Max(Querymax(Node<<,l,Mid,L,R),Querymax(Node<<|,Mid+,r,L,R));
  98. }
  99. int Querysum_tree(int u,int v){
  100. int Ans=;
  101. while(Top[u]!=Top[v])
  102. if(Deep[Top[u]]<Deep[Top[v]]){
  103. Ans+=Querysum(,,m,w[Top[v]],w[v]);
  104. v=f[Top[v]];
  105. }else{
  106. Ans+=Querysum(,,m,w[Top[u]],w[u]);
  107. u=f[Top[u]];
  108. }
  109. if(w[u]<w[v])Ans+=Querysum(,,m,w[u],w[v]);else Ans+=Querysum(,,m,w[v],w[u]);
  110. return Ans;
  111. }
  112. int Querymax_tree(int u,int v){
  113. int Ans=-INF;
  114. while(Top[u]!=Top[v])
  115. if(Deep[Top[u]]<Deep[Top[v]]){
  116. Ans=_Max(Ans,Querymax(,,m,w[Top[v]],w[v]));
  117. v=f[Top[v]];
  118. }else{
  119. Ans=_Max(Ans,Querymax(,,m,w[Top[u]],w[u]));
  120. u=f[Top[u]];
  121. }
  122. if(w[u]<w[v])Ans=_Max(Ans,Querymax(,,m,w[u],w[v]));else Ans=_Max(Ans,Querymax(,,m,w[v],w[u]));
  123. return Ans;
  124. }
  125. int main()
  126. {
  127. Read(n);
  128. for(i=;i<n;i++){
  129. Read(x);Read(y);
  130. Add(x,y);
  131. Add(y,x);
  132. }
  133. for(i=;i<=n;i++)Read(a[i]);
  134. Dfs1(,);
  135. Dfs2(,);
  136. Build(,,m);
  137. Read(T);
  138. while(T--){
  139. Read(S);Read(x);Read(y);
  140. if(S[]=='C')Update(,,m,w[x],y);else
  141. if(S[]=='S')Print(Querysum_tree(x,y));else Print(Querymax_tree(x,y));
  142. }
  143. return ;
  144. }

bzoj1036

bzoj1036--树链剖分的更多相关文章

  1. 洛谷3384&bzoj1036树链剖分

    值得注意的是: 一个点的子树是存在一起的...也就是说我们修改子树的时候只用... /********************************************************* ...

  2. 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分

    [BZOJ1036][ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. ...

  3. 【BZOJ1036】 树的统计Count (树链剖分)

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...

  4. BZOJ1036 [ZJOI2008]树的统计Count 树链剖分

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1036 题意概括 一个树,每个节点有一个权值.3种操作. 1:修改某一个节点的权值. 2:询问某两个 ...

  5. [BZOJ1036][ZJOI2008]树的统计Count 解题报告|树链剖分

    树链剖分 简单来说就是数据结构在树上的应用.常用的为线段树splay等.(可现在splay还不会敲囧) 重链剖分: 将树上的边分成轻链和重链. 重边为每个节点到它子树最大的儿子的边,其余为轻边. 设( ...

  6. 【BZOJ1036】树的统计Count(树链剖分,LCT)

    题意:一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: ...

  7. bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题

    [ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...

  8. bzoj1036 [ZJOI2008]树的统计Count(树链剖分)

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...

  9. 树链剖分学习&BZOJ1036

    题目传送门 树链剖分,计算机术语,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组.SBT.SPLAY.线段树等)来维护每一条链. ...

  10. bzoj1036 count 树链剖分或LCT

    这道题很久以前用树链剖分写的,最近在学LCT ,就用LCT再写了一遍,也有一些收获. 因为这道题点权可以是负数,所以在update时就要注意一下,因为平时我的0节点表示空,它的点权为0,这样可以处理点 ...

随机推荐

  1. [Egret]优雅的写http

    首先,自从使用链式调用的写法后,就一发不可收拾的喜爱上了这种优雅的方式.不管是写架构还是写模块,我都会不自觉的使用这种最优雅的方式.链式写法既减少了代码量,又非常优雅的. 在使用 egret 的htt ...

  2. 通过AngularJS实现前端与后台的数据对接(一)——预备工作篇

    最近,笔者在做一个项目:使用AngularJS,从而实现前端与后台的数据对接.笔者这是第一次做前端与后台的数据对接的工作,因此遇到了许多问题.笔者在这些问题中,总结了一些如何实现前端与后台的数据对接的 ...

  3. Java多态性——分派

    一.基本概念 Java是一门面向对象的程序设计语言,因为Java具备面向对象的三个基本特征:封装.继承和多态.这三个特征并不是各自独立的,从一定角度上看,封装和继承几乎都是为多态而准备的.多态性主要体 ...

  4. .Net语言 APP开发平台——Smobiler学习日志:手机应用的TextTabBar快速实现方式

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...

  5. Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目

    默认,在用vs2013开发SharePoint项目时,vs没有提供一般应用程序(.ashx)的项目模板,本文解决此问题. 以管理员身份启动vs2013,创建一个"SharePoint 201 ...

  6. could not initialize proxy - no Session

    这是一个精典的问题:因为我们在hibernate里面load一个对象出来时,用到的是代理对象,也就是说当我们在执行load方法时并没有发sql语句,而是返回一个proxy对象.只有当们具体用到哪个ge ...

  7. Mono 3.2.7发布,JIT和GC进一步改进

    Mono 3.2.7已经发布,带来了很多新特性,如改进的JIT.新的面向LINQ的解释器以及使用了64位原生指令等等. 这是一次主要特性发布,累积了大约5个月的开发工作.看上去大部分改进都是底层的性能 ...

  8. Android下/data/data/<package_name>/files读写权限

    今天将更新模块拿到android上面测试的时候,发现在创建writablepath.."upd/"目录的时候出现Permission Denied提示BTW:我使用的是lfs来创建 ...

  9. 详解微信开发者文档——5 access_token管理

    写在前面的话:前几篇博客详细讲解了如何获取用户发送的消息并进行回复,这里的回复是一种被动的回复,而被动回复的方式便是通过echo返回信息给微信服务器的POST请求,因此,其实我们并没有算的上调用了微信 ...

  10. CSharpGL(29)初步封装Texture和Framebuffer

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...