bzoj1036 zjoi2008 树的统计 count
填坑= =第一道裸树剖
#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的更多相关文章
- [BZOJ1036][ZJOI2008]树的统计Count 解题报告|树链剖分
树链剖分 简单来说就是数据结构在树上的应用.常用的为线段树splay等.(可现在splay还不会敲囧) 重链剖分: 将树上的边分成轻链和重链. 重边为每个节点到它子树最大的儿子的边,其余为轻边. 设( ...
- bzoj1036 [ZJOI2008]树的统计Count
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MB Submit: 12646 Solved: 5085 [Subm ...
- bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题
[ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...
- bzoj千题计划124:bzoj1036: [ZJOI2008]树的统计Count
http://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分板子题 #include<cstdio> #include<iost ...
- BZOJ1036 [ZJOI2008]树的统计Count 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1036 题意概括 一个树,每个节点有一个权值.3种操作. 1:修改某一个节点的权值. 2:询问某两个 ...
- 【lct】bzoj1036 [ZJOI2008]树的统计Count
题意:给你一棵树,点带权,支持三种操作:单点修改:询问链上和:询问链上max. 这里的Query操作用了与上一题不太一样的做法(上一题用那种做法,因为在边带权的情况下换根太困难啦): 先ChangeR ...
- BZOJ1036[ZJOI2008]树的统计Count 题解
题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.有一些操作:1.把结点u的权值改为t:2.询问从点u到点v的路径上的节点的最大权值 3.询问从点u到点v的路径上的节点的权值和 ...
- [BZOJ1036] [ZJOI2008] 树的统计Count (LCT)
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...
- bzoj1036 [ZJOI2008]树的统计Count(树链剖分)
Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...
随机推荐
- Java jdk环境搭建
java JDK的配置在我的电脑环境变量中配置: 主要的配置参数path 例:path = C:\jdk1.7.0_13\bin ; 另外一个JAVA_HOME 例:JAVA_HOME = C:\j ...
- Xcode编译项目出现访问private key提示框
原因: 在编译时Xcode进行codesign时需要访问"private key"时没有权限,然后让询问是否允许,有三个选项,全部允许.否绝.允许,一次弹出4个(我遇到的) 遇到问 ...
- html5 DeviceOrientation来实现手机网站上的摇一摇功能
原文地址:http://www.cootm.com/?p=706 从网上转载看到的,感觉不错,就转过来了,特此感谢 cnblogs 的 幸福2胖纸的码农生活,直接转载了,不要介意!呵呵 以下是转载内容 ...
- Python 基础 文件操作
字符串与字节之间的转换 # utf-8 一个汉字 占三个字节 # gbk 一个汉字 占两个字节 # 字符串转换成字节 print(bytes('汉字', encoding='utf-8'))print ...
- Day14 html简介
初识html <!DOCTYPE html> <html lang="en"> <head> <!--自闭合标签--> <me ...
- D题 - A+B for Input-Output Practice (III)
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description Your ...
- 使用Echarts的五个步骤
_liuz 2015-07-22 09:35:53 参考网址:http://echarts.baidu.com/doc/start.html 一.制作一个图表容器<div id="m ...
- wildcard 处理全部文件
Makefile如果想取得文件夹下全部文件 $(wildcard $(PATH)/*.c) 即可
- The Wedding Juicer
poj2227:http://poj.org/problem?id=2227 题意:给你一块矩形区域,这个矩形区域是由一个个方格拼起来的,并且每个方格有一个高度.现在给这个方格灌水,问最多能装多少水. ...
- HAPROXY实习
没事玩玩,简单搞定. 同一个URL可以分发到后端不同的WEB上. STATS页画也刷出来了. 参考网址: http://www.cnblogs.com/kgdxpr/p/3272861.html 如果 ...