Description

一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。

我们将以下面的形式来要求你对这棵树完成一些操作:

I. CHANGE u t : 把结点u的权值改为t

II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值

III. QSUM u v: 询问从点u到点v的路径上的节点的权值和

注意:从点u到点v的路径上的节点包括u和v本身

Input

输入文件的第一行为一个整数n,表示节点的个数。

接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有一条边相连。

接下来一行n个整数,第i个整数wi表示节点i的权值。

接下来1行,为一个整数q,表示操作的总数。

接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。

Output

对于每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示要求输出的结果。

树剖裸题 刷水题吼啊

这题是一个裸的点权,不用转边权做.大水题

单点修改,\(tag\)都不用打.qwq

线段树维护区间最大值,区间和。

单点修改要对\(dfn\)修改!! (本来要切掉的,结果这里写错了.

代码

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#define int long long
#define R register
#define ls o<<1
#define rs o<<1|1
#define N 30008
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int head[N],tot,depth[N],size[N],f[N],son[N];
struct cod{int u,v;}edge[N<<1];
int dfn[N],idx,fdfn[N],top[N];
int n,a[N],m,tr[N<<2],mx[N<<2];
char s[18];
inline void add(int x,int y)
{
edge[++tot].u=head[x];
edge[tot].v=y;
head[x]=tot;
}
inline void up(int o)
{
tr[o]=tr[ls]+tr[rs];
mx[o]=max(mx[ls],mx[rs]);
}
void build(int o,int l,int r)
{
if(l==r)
{
mx[o]=tr[o]=a[fdfn[l]];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
up(o);
}
int query_sum(int o,int l,int r,int x,int y)
{
if(x<=l and y>=r)return tr[o];
int mid=(l+r)>>1,res=0;
if(x<=mid)res+=query_sum(ls,l,mid,x,y);
if(y>mid)res+=query_sum(rs,mid+1,r,x,y);
return res;
}
int query_max(int o,int l,int r,int x,int y)
{
if(x<=l and y>=r)return mx[o];
int mid=(l+r)>>1,res=-2147483647;
if(x<=mid)res=max(res,query_max(ls,l,mid,x,y));
if(y>mid)res=max(res,query_max(rs,mid+1,r,x,y));
return res;
}
void change(int o,int l,int r,int pos,int k)
{
if(l==r){mx[o]=tr[o]=k;return;}
int mid=(l+r)>>1;
if(pos<=mid)change(ls,l,mid,pos,k);
else change(rs,mid+1,r,pos,k);
up(o);
}
void dfs1(int u,int fa)
{
size[u]=1;f[u]=fa;depth[u]=depth[fa]+1;
for(R int i=head[u];i;i=edge[i].u)
{
if(edge[i].v==fa)continue;
dfs1(edge[i].v,u);
size[u]+=size[edge[i].v];
if(son[u]==-1 or size[son[u]]<size[edge[i].v])
son[u]=edge[i].v;
}
}
void dfs2(int u,int t)
{
dfn[u]=++idx;fdfn[idx]=u;top[u]=t;
if(son[u]==-1)return;
dfs2(son[u],t);
for(R int i=head[u];i;i=edge[i].u)
{
if(dfn[edge[i].v])continue;
dfs2(edge[i].v,edge[i].v);
}
}
int tquery(int x,int y)
{
int fx=top[x],fy=top[y],res=0;
while(fx!=fy)
{
if(depth[fx]>depth[fy])
{
res+=query_sum(1,1,idx,dfn[fx],dfn[x]);
x=f[fx];
}
else
{
res+=query_sum(1,1,idx,dfn[fy],dfn[y]);
y=f[fy];
}
fx=top[x],fy=top[y];
}
if(dfn[x]>dfn[y])swap(x,y);
res+=query_sum(1,1,idx,dfn[x],dfn[y]);
return res;
}
int tquery_max(int x,int y)
{
int fx=top[x],fy=top[y],res=-2147483647;
while(fx!=fy)
{
if(depth[fx]>depth[fy])
{
res=max(res,query_max(1,1,idx,dfn[fx],dfn[x]));
x=f[fx];
}
else
{
res=max(res,query_max(1,1,idx,dfn[fy],dfn[y]));
y=f[fy];
}
fx=top[x],fy=top[y];
}
if(dfn[x]>dfn[y])swap(x,y);
res=max(res,query_max(1,1,idx,dfn[x],dfn[y]));
return res;
}
signed main()
{
in(n);memset(son,-1,sizeof son);
for(R int i=1,x,y;i<n;i++)
{
in(x),in(y);
add(x,y);add(y,x);
}
dfs1(1,0);dfs2(1,1);
for(R int i=1;i<=n;i++)in(a[i]);
build(1,1,n);
in(m);
for(R int x,y;m;m--)
{
scanf("%s",s);in(x),in(y);
if(s[3]=='X')
printf("%lld\n",tquery_max(x,y));
else if(s[3]=='M')
printf("%lld\n",tquery(x,y));
else
change(1,1,idx,dfn[x],y);
}
}

树链剖分【p2590】[ZJOI2008]树的统计的更多相关文章

  1. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

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

  2. bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1272  Solved: 451[Submit][Status ...

  3. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4637  Solved: 1726[Submit][Status ...

  4. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  5. 【洛谷5439】【XR-2】永恒(树链剖分,线段树)

    [洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...

  6. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  7. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  8. 【BZOJ3531】旅行(树链剖分,线段树)

    [BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...

  9. 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)

    [BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...

  10. [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树

    软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...

随机推荐

  1. jmeter 运行脚本报错 java.net.BindException: Address already in use

    在win下跑jmeter时,在聚合报告中出现错误.打开日志文件(前提是将日志写入了指定文件) 发现报错的原因为:java.net.BindException: Address already in u ...

  2. node.js和npm的安装

    1.进入node.js官方网站,下载和系统对应的版本,我下载的是这个最新版本:node-v8.2.1-x64.msi https://nodejs.org/en/download/ 2.windows ...

  3. DDT驱动

    下载ddt并安装 Pip install ddt 或者官网下载安装 http://ddt.readthedocs.io/en/latest/ https://github.com/txels/ddt ...

  4. 融合模型Aggregation

    从一堆弱分类器融合得到强分类器. 比如假设现在你只能水平或竖直线分割,那么无论如何都分不好,但是假设组合三次分割,就会得到如图所示的一个较好的分割线. 再比如,PLA 融合后有large margin ...

  5. PPC Windows Mobile判断网络(gprs)连接与否代码

    转载 在PPC的开发中有时需要判断网络什么时候连接,什么时候断开,并且做出相应的处理.比如说TimeSyncPPC程序,就需要在网络连接之后得到消息然后去下载时间同步信息,因此就必须要一种方法让Tim ...

  6. 【Luogu】P4103大工程(虚树DP)

    题目链接 我貌似发现这类DP就是先别管什么虚树……把树形DP搞出来套上虚树板子就好了 这个树形DP就是设sum为答案,sumd为子树内所有点的深度和(当然指的是被询问的点),maxi指子树内最深的点的 ...

  7. LeetCode -- Product of Array Except Self My Submissions Question

    Question: Given an array of n integers where n > 1, nums, return an array output such that output ...

  8. 泛型与非泛型集合类的区别及使用例程,包括ArrayList,Hashtable,List<T>,Dictionary<Tkey,Tvalue>,SortedList<Tkey,Tvalue>,Queue<T>,Stack<T>等

    泛型与非泛型集合类在C#程序中是非常重要的一个基础概念,这里列一个表来进行对比: 非泛型集合类 泛型集合类 描述 ArrayList List<T> 表示具有动态大小的对象数组 Hasht ...

  9. nutch 2.1安装问题集锦

    参照官方文档http://nlp.solutions.asia/?p=180 中间碰到的问题,解决方法参考 http://blog.javachen.com/2014/05/20/nutch-intr ...

  10. 洛谷P1160 队列安排

    题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次入列,编号为i的同学入列方式为:老师 ...