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. struts2 中的 addActionError 、addFieldError、addActionMessage方法的区别添加错误信息

    转自:https://www.cnblogs.com/wangyp/archive/2011/07/13/2104828.html 一.addActionError("错误内容") ...

  2. Taro -- 微信小程序密码弹窗

    记录一个类似支付密码的弹窗写法,实现是否免密功能.如图: index.js   import Taro, { Component } from '@tarojs/taro'   import { Vi ...

  3. python pip安装模块报错 "Can't connect to HTTPS URL because the SSL module is not available."

    在升级python版本为3.6之后,pip安装模块报错. 报错信息如图: 原因是系统自带的openssl版本与python3的版本不匹配,所以这里只要升级openssl版本就可以解决问题. yum - ...

  4. TCP窗口

    一.窗口移动1.在建立TCP连接时,接收端会告诉发送端自己的接收窗口.2.发送端在发送数据时,会先为数据分包,编号,然后先发送窗口大小的数据(数据大于窗口大小),小于则全部发送了,窗口后的不允许发送. ...

  5. python常用函数 Z

    zip(iterable, iterable..) 数据打包和解包,一般结果是一个元组(最短匹配). 例子:

  6. 14DBCP连接池

    实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection.这样我们就不需要每次都创建连接.释放连接了,这些操作 ...

  7. shell 操作mysql

    1.连接 #!/bin/bash user="root" password="XXXXXX" sql = `mysql -u>/dev/null use ...

  8. Cobaltstrike系列教程(二)-Listner与Payload生成 heatlevel

    0x000-前文 Cobaltstrike系列教程(一)简介与安装 0x001-Listner(监听器)介绍 ①Cobaltstrike listner简介 可能有一些小白并不理解什么叫做listne ...

  9. python之requests模块中的params和data的区别

    params的时候之间接把参数加到url后面,只在get请求时使用: import requests url='https://api.ireaderm.net/account/charge/info ...

  10. Eclipse使用maven创建SSM-web项目

    1.环境准备 (1)maven:apache-maven-3.5.2,我的maven安装在D:\apache-maven-3.5.2,eclipse中maven配置如下: 先add ,添加好自己的ma ...