luogu P2590 [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]树的统计(树链剖分)的更多相关文章

  1. BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 23015  Solved: 9336[Submit ...

  2. 树的统计Count---树链剖分

    NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...

  3. BZOJ1036[ZJOI2008]树的统计——树链剖分+线段树

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

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

    本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...

  5. [luogu P2590 ZJOI2008] 树的统计 (树链剖分)

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

  6. 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]

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

  7. BZOJ 1036 树的统计-树链剖分

    [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...

  8. BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)

    潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...

  9. bzoj1036 树的统计 树链剖分模板

    题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...

随机推荐

  1. linux命令中chmod 777 以及drwxr-xr-x分别代表什么意思

    最近跟一个运维人员学了点新东西,感觉以前没怎么注意,但现在感觉很有用,特来记录一下. linux使用==ll==命令列出列表的时候,前面总是有一堆drwxr-xr-x ,这些代表什么意思从来还没有去在 ...

  2. JMETER - BEANSHELL获取响应结果

    获取响应结果 添加后置处理器     //获取获取请求的返回值 String response = prev.getResponseDataAsString(); //日志打印获取请求的返回值 log ...

  3. visual studio 中添加命令行参数

    argc argv

  4. pandas.Series函数用法

    class pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False) e.g., ...

  5. 【leetcode】1046. Last Stone Weight

    题目如下: We have a collection of rocks, each rock has a positive integer weight. Each turn, we choose t ...

  6. bio编程示例

    直接干代码,用BIO写一个Server端,然后使用telnet模拟客户端发送数据 import java.io.IOException; import java.io.InputStream; imp ...

  7. 阿里云弹性裸金属服务器-神龙架构(X-Dragon)揭秘

    在5月16日的飞天技术会新品直播中,特别邀请了业界知名大咖狒哥以及阿里云虚拟化资深专家旭卿作为现场直播的嘉宾.本次直播主要从产品背景到“X-Dragon架构”,从硬件设备到软件应用来深度的剖析“X-D ...

  8. 求超大文件上传方案( Java )

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  9. Cluster基础(三):配置HAProxy负载平衡集群、Keepalived高可用服务器、Keepalived+LVS服务器

    一.配置HAProxy负载平衡集群 目标: 准备三台Linux服务器,两台做Web服务器,一台安装HAProxy,实现如下功能: 客户端访问HAProxy,HAProxy分发请求到后端Real Ser ...

  10. redux简单使用

    在前面的随便中有简单的使用过redux和react-redux,但是感觉写在一起,总是理不清楚,后面看了技术胖老师关于redux的视频后,感觉自己又有了新的理解,在这里简单记录一下. 项目准备 首先安 ...