填坑= =第一道裸树剖

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector> using namespace std; const int Maxn=,Maxm=,INF=~0u>>; int n; struct Data{
int sum,max;
Data (int sum=,int max=-INF):sum(sum),max(max){}
Data operator + (const Data& rhs)const{
return Data(sum+rhs.sum,std::max(max,rhs.max));
}
}; struct SegmentTree{
Data da[Maxn*];
int lft,rgt,w;
void pp(int l,int r=){
lft=l;rgt=r;
}
void change(int s,int l,int r){
if(l==r && l==lft){
da[s]=Data(w,w);
return;
}
int mid=(l+r)>>;
if(lft<=mid) change(s<<,l,mid);
else change(s<<|,mid+,r);
da[s]=da[s<<]+da[s<<|];
}
Data query(int s,int l,int r){
if(lft<=l && r<=rgt) return da[s];
int mid=(l+r)>>;
if(rgt<=mid) return query(s<<,l,mid);
if(mid<lft) return query(s<<|,mid+,r);
return query(s<<,l,mid) + query(s<<|,mid+,r);
}
}seg; int en[Maxm*],next[Maxm*],fir[Maxn],tot; void Add(int from,int to){
en[++tot] = to;
next[tot] = fir[from];
fir[from] = tot;
} int sz[Maxn],fa[Maxn],son[Maxn],dep[Maxn]; void dfs(int u){
sz[u]=;
son[u]=;
for(int k=fir[u];k;k=next[k]){
int v=en[k];
if(v == fa[u]) continue;
fa[v] = u;
dep[v]=dep[u]+;
dfs(v);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]]) son[u] = v;
}
} int pos[Maxn],top[Maxn],tm; void build(int u,int pre){
top[u]=pre;
pos[u]=++tm;
if(son[u]) build(son[u],pre);
for(int k=fir[u];k;k=next[k]){
int v=en[k];
if(v==fa[u] || v==son[u]) continue;
build(v,v);
}
} Data query(int a,int b){
int ta=top[a],tb=top[b];
Data ret;
for(;ta!=tb;a=fa[ta],ta=top[a]){
if(dep[ta]<dep[tb]) swap(a,b), swap(ta,tb);
seg.pp(pos[ta],pos[a]);
ret=ret+seg.query(,,n);
}
if(dep[a]>dep[b]) swap(a,b);
seg.pp(pos[a],pos[b]);
return ret+seg.query(,,n);
} int main(){
#ifdef DEBUG
freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#endif scanf("%d",&n);
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
Add(u,v);
Add(v,u);
} dfs();
build(,); for(int i=;i<=n;i++){
seg.pp(pos[i]);
scanf("%d",&seg.w);
seg.change(,,n);
} int m;
scanf("%d",&m);
char cmd[];
int a,b; for(;m--;){
scanf("%s%d%d",cmd,&a,&b);
if(cmd[]=='C') seg.lft=pos[a],seg.w=b,seg.change(,,n);
else if(cmd[]=='S') printf("%d\n",query(a,b).sum);
else printf("%d\n",query(a,b).max);
} return ;
}

bzoj1036 zjoi2008 树的统计 count的更多相关文章

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

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

  2. bzoj1036 [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 12646  Solved: 5085 [Subm ...

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

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

  4. bzoj千题计划124:bzoj1036: [ZJOI2008]树的统计Count

    http://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分板子题 #include<cstdio> #include<iost ...

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

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

  6. 【lct】bzoj1036 [ZJOI2008]树的统计Count

    题意:给你一棵树,点带权,支持三种操作:单点修改:询问链上和:询问链上max. 这里的Query操作用了与上一题不太一样的做法(上一题用那种做法,因为在边带权的情况下换根太困难啦): 先ChangeR ...

  7. BZOJ1036[ZJOI2008]树的统计Count 题解

    题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.有一些操作:1.把结点u的权值改为t:2.询问从点u到点v的路径上的节点的最大权值 3.询问从点u到点v的路径上的节点的权值和 ...

  8. [BZOJ1036] [ZJOI2008] 树的统计Count (LCT)

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

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

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

随机推荐

  1. 如何获取App当前版本号

    NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary]; NSString *currentVersion = [infoDic ...

  2. Spring 创建bean的模式

    在默认情况下,spring创建bean是单例模式 scope="singleton ",还有一种方式为多例模式[prototype]     scope          sing ...

  3. SGU 153.Playing with matches

    题意: 一个取火柴游戏,可以取的数在一个集合S内,S必包含1,且不超过9个数,每个数都不大于9.最后取完者失败. 求n(n<10^9)根火柴时先取的胜利还是后取的胜利. Solution: 典型 ...

  4. [FindBugs分析记录]Redundant nullcheck of o,which is known to be non-null

    官网解释: This method contains a redundant check of a known non-null value against the constant null. 这种 ...

  5. java.math.BigDecimal类

    BigDecimal类用于高精度计算.一般的float型和Double型数据只可以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecima ...

  6. Jquery中index()问题

    对于Jquery中的index()问题,很多人会说这个很简单的,并不是一个非常困难的方法.笔者开始的时候也是这样子认为的,但是今天遇到一个index的问题,让我忙了一个晚上都没有解决,最后还是使用co ...

  7. iOS适配:Masonry介绍与使用实践:快速上手Autolayout

    随着iPhone的手机版本越来越多, 那么对于我们广大的开发者来说就是很悲催,之前一直使用代码里面layout的约束来适配, 现在推荐一个第三方Masonry,上手块,操作简单,只能一个字形容他 “爽 ...

  8. php之文件上传简单介绍

    要声明的form表单格式 <form action="act.php" method="post" enctype="multipart/for ...

  9. Html5游戏框架createJs的简单用法

    声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!http://www.it165.net/pro/html/201403/11105.html 楼主记忆力不好,最近刚好用了一下create ...

  10. 快速傅里叶变换(FFT)

    一.FFT的意义 DFT虽然实现了FT的计算机计算,但是计算量大,不适合实时的数字信号处理.FFT算法的出现,使DFT的计算效率更高,速度更快. 二.FFT与DFT的关系 从FT到DFT经过了数字角频 ...