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. 刚新建好的动态网站项目,创建jsp页面就报错??

    拿到刚刚可以运行的Eclipse,就马上想敲码了,但一创建项目之后再创建jsp页面就报错= =! 报错的内容大概为缺乏对应的jar包. 我们常用Tomcat为中间体,而他本身是带有开发jsp网站的对应 ...

  2. 箭头函数的this指向问题

    this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this.正是因为它没有this,所以也就不能用作构造函数 ...

  3. eclipse 代码提示快捷键 alt+/

    eclipse (ALT+/)1.选择Eclipse菜单栏中的Window->preferences: 2.选择General->keys; 3.在右侧中间的窗体中点击word compl ...

  4. F1函数csdn 是否支持版本

    https://docs.microsoft.com/zh-cn/windows/desktop/api/winsock2/nf-winsock2-wsaioctl

  5. nbench

    http://www.math.utah.edu/~mayer/linux/bmark.html nbench-byte-2.2.3  --> http://www.math.utah.edu/ ...

  6. 伊朗Cisco路由器遭黑客攻击 全国互联网几乎瘫痪

    2018年4月9日,黑客攻击了伊朗的国家信息数据中心.伊朗internet信息安全部称,此次大规模袭击影响了全球约二十万个思科Cisco路由交换器,也包括伊朗的几千个路由器.攻击也影响了互联网服务供应 ...

  7. Ubuntu 18.04 安装 Octave 5.1

    最新版目前只能通过编译安装.折腾了半天终于搞定: 需要使用apt-get install先把各种 dependencies 安装好. 编译JIT需要安装sudo apt-get install llv ...

  8. 记录ViewPager配合Fragment使用中遇到的一个问题

    java.lang.IllegalStateException: FragmentManager is already executing transactions 如图所示: 当调用 notifyD ...

  9. 数据库(一):事务的特性与事务(在同一个 JVM 中)的传递

    参考文章 https://blog.csdn.net/shuaihj/article/details/14163713 https://blog.csdn.net/shfqbluestone/arti ...

  10. 谷歌浏览器 安装 Vue.js devtools 工具

    如果是vue写的项目,谷歌浏览器右上角的vue小图标会亮起!下面介绍如何安装 1.谷歌浏览器插件商店可以点击安装[需要梯子] 2.vue官网有对应的安装包,需要自己手动 npm run build 一 ...