luoguP2590 [ZJOI2008]树的统计(树链剖分)
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<queue>
#define rg register
#define lst long long
#define N 30050
#define ls (now<<1)
#define rs (now<<1|1)
using namespace std; int n,Q,cnt,ss,root,ans;
struct EDGE{
int to,nxt;
}edge[N<<];
struct TREE{
int l,r,Max,sum;
}ljl[N<<];
int v[N],head[N];
int fa[N],deep[N],size[N],num[N];
int vv[N],top[N],son[N]; inline void add(rg int p,rg int q){edge[++cnt]=(EDGE){q,head[p]};head[p]=cnt;}
inline int read()
{
rg int s=,m=;rg char ch=getchar();
while(ch!='-'&&(ch<''||ch>''))ch=getchar();
if(ch=='-')m=-,ch=getchar();
while(ch>=''&&ch<='')s=(s<<)+(s<<)+ch-'',ch=getchar();
return s*m;
} inline void init()
{
n=read();root=;
for(rg int i=;i<n;++i)
{
rg int p=read(),q=read();
add(p,q),add(q,p);
}
for(rg int i=;i<=n;++i)v[i]=read();
} void dfs_1(rg int now,rg int fm,rg int dep)
{
rg int kk=;
fa[now]=fm,deep[now]=dep,size[now]=;
for(rg int i=head[now];i;i=edge[i].nxt)
{
rg int qw=edge[i].to;
if(qw!=fm)
{
dfs_1(qw,now,dep+);
size[now]+=size[qw];
if(size[qw]>kk)kk=size[qw],son[now]=qw;
}
}
} void dfs_2(rg int now,rg int up)
{
num[now]=++ss,vv[ss]=v[now],top[now]=up;
if(son[now])dfs_2(son[now],top[now]);
for(rg int i=head[now];i;i=edge[i].nxt)
{
rg int qw=edge[i].to;
if(qw!=fa[now]&&qw!=son[now])
dfs_2(qw,qw);
}
} inline void Pushup(rg int now)
{
ljl[now].Max=max(ljl[ls].Max,ljl[rs].Max);
ljl[now].sum=ljl[ls].sum+ljl[rs].sum;
} void build(rg int now,rg int ll,rg int rr)
{
ljl[now]=(TREE){ll,rr};
if(ll==rr)
{
ljl[now].Max=ljl[now].sum=vv[ll];
return;
}
rg int mid=(ll+rr)>>;
build(ls,ll,mid),build(rs,mid+,rr);
Pushup(now);
} void change(rg int now,rg int kk,rg int x)
{
if(ljl[now].l==kk&&ljl[now].r==kk)
{
ljl[now].Max=ljl[now].sum=x;
return;
}
rg int mid=(ljl[now].l+ljl[now].r)>>;
if(kk<=mid)change(ls,kk,x);
else change(rs,kk,x);
Pushup(now);
} int get_max(rg int now,rg int ll,rg int rr)
{
rg int ss=-1e9;
if(ljl[now].l>=ll&&ljl[now].r<=rr)return ljl[now].Max;
rg int mid=(ljl[now].l+ljl[now].r)>>;
if(rr<=mid)ss=max(ss,get_max(ls,ll,rr));
if(ll>mid) ss=max(ss,get_max(rs,ll,rr));
if(ll<=mid&&rr>mid)ss=max(ss,max(get_max(ls,ll,mid),get_max(rs,mid+,rr)));
return ss;
} int get_sum(rg int now,rg int ll,rg int rr)
{
rg int ss=;
if(ljl[now].l>=ll&&ljl[now].r<=rr)return ljl[now].sum;
rg int mid=(ljl[now].l+ljl[now].r)>>;
if(rr<=mid)ss+=get_sum(ls,ll,rr);
if(ll>mid) ss+=get_sum(rs,ll,rr);
if(ll<=mid&&rr>mid)ss+=get_sum(ls,ll,mid)+get_sum(rs,mid+,rr);
return ss;
} inline void work(rg int x,rg int y,rg int op)
{
if(num[x]>num[y])swap(x,y);
if(!op)ans=max(ans,get_max(,num[x],num[y]));
if(op) ans+=get_sum(,num[x],num[y]);
} inline void Work(rg int x,rg int y,rg int op)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]])swap(x,y);
work(top[x],x,op);
x=fa[top[x]];
}
work(x,y,op);
} inline void Ans()
{
Q=read();
for(rg int i=;i<=Q;++i)
{
char type[];cin>>type;
rg int x=read(),y=read();
if(type[]=='N'){ change(,num[x],y);}//change
if(type[]=='X'){ans=-1e9;Work(x,y,);printf("%d\n",ans);}//qmax
if(type[]=='M'){ans=; Work(x,y,);printf("%d\n",ans);}//qsum
}
} int main()
{
init();
dfs_1(root,,);
dfs_2(root,root);
build(,,n);
Ans();
return ;
}
luoguP2590 [ZJOI2008]树的统计(树链剖分)的更多相关文章
- BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 23015 Solved: 9336[Submit ...
- 树的统计Count---树链剖分
NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...
- BZOJ1036[ZJOI2008]树的统计——树链剖分+线段树
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- [ZJOI2008]树的统计——树链剖分
本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...
- [luogu P2590 ZJOI2008] 树的统计 (树链剖分)
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]
题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
- bzoj1036 树的统计 树链剖分模板
题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...
随机推荐
- tail 显示文件内容尾部
1.命令功能 tail默认显示文件内容尾部10行. 2.语法格式 tail option file 参数说明 参数 参数说明 -n 显示指定行数 -f 实时输出文件变化后追加的数据 -s 监视文件 ...
- PTA 错题记录
程设期中考, 记录一下曾经做错的选择填空. 1. 2. 3. 4. 5. 6.
- spring requestbody json
1 @requestbody string param 前台将jsonobject序列化成字符串 后台解析成JsonObject 2 @requestbody map<string,objec ...
- MySQL重复数据中限定操作n条
对于一个表,有时可能里面有很多重复的条,比如: +-----------+---------+| coupon_id | user_id |+-----------+---------+| 8 | 1 ...
- django之mysql数据库的配置和orm交互
一:django默认数据库的配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path. ...
- Java面向对象(一) 类和对象
一.软件开发进化史 摘自<从零开始学架构> 机器语言(1940年) 最早的软件开发使用的是“机器语言”,直接使用二进制码0和1来表示机器可以识别的指令和数据. 汇编语言(20世纪40年代) ...
- Python3解leetcode Reach a Number
问题描述: You are standing at position 0 on an infinite number line. There is a goal at position target. ...
- Web 开发中很实用的效果【源码下载】
网页特效下载 引用地址:http://www.yyyweb.com/350.html 超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应 ...
- 音悦台 api分析
用户订阅MV更新 http://uapi.yinyuetai.com/i/flw/subscribe-video-list?page=1&pageSize=200&uid=XXXXXX ...
- 洛谷P1120 小木棍 [数据加强版](搜索)
洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...