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 ...
随机推荐
- 10集合:List<T>,Dictionary<K,V>
List<T>泛型集合 List<T>是C#中一种快捷.易于使用的泛型集合类型,使用泛型编程为编写面向对象程序增加了极大的效率和灵活性. 1.List<T>用法 ...
- Sublime Text 3运行JavaScript控制台
Node.js是一个基于Chrome JavaScript运行时建立的平台,小巧方便搭建.运行的端口可以在浏览器上运行,显示效果,但每次用浏览器也挺麻烦,我们这里讲的是在sublime text2中配 ...
- Spring中的创建与销毁
在bean中添加属性init-method="方法名" destroy-method="方法名" init-method 该方法是由spring容 ...
- 封装Timer
System.Timers.Timer,System.Timers.Timer在使用的过程中需要: 1.构造函数不同,构造函数可以什么事情也不做,也可以传入响应间隔时间:System.Timers.T ...
- ExtJS4 动态加载
由于有人说不要每次都调用ext-all.js,会影响性能,所以有考虑动态加载,动态加载时页面调用ext.js(4.0.7在调试时可考虑用ext-dev.js),然后在onReady之前调用 Ext.L ...
- WAMP学习日记之:Apache发布php网站
1.修改httpd.conf 文件,以便让Apache和php模块建立关联 2.配置php.ini文件 修改httpd.conf 文件,以便让Apache和php模块建立关联 如何让apache和ph ...
- iscc2016-basic-find-to-me
额 第一题就暴力搜索了 已知仿射加密变换为c=(11m+8)mod26,试对密文sjoyuxzr解密 #include <stdio.h> int main(void) { int m,c ...
- 深入浅出C语言中的堆和栈
在谈堆栈的时候,我在这有必要把计算机的内存结构给大家简单的介绍下(高手们可以直接飘过) 一. 内存结构 每个程序一启动都有一个大小为4GB的内存,这个内存叫虚拟内存,是概念上的,真正能用到的,只是 ...
- Ajax页面逻辑
逻辑上模拟整个与服务器通信的过程.在没有真正与服务器通信的时候,如何写这样的ajax请求. 先根据页面结构创建一个静态数据(JSON) var arrival_address_data={" ...
- CodeAssistant
软件名:CodeAssistant 很霸气的名字,不过目前仅有的功能是代码格式化. 用途: 在向大神请教时,不妨用这小软件把自己的代码格一下.我们的口号就是让大神看得舒心,让BUG无处遁形. 演示: ...