【题目大意】

一棵树上有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本身

【思路】

我来兑现继续做ZJOI2008的flag了。裸的树链剖分,不说什么。但是!主意权值可以为负数,可以为负数!!所以初始化的时候max不是-1,而是要记得清成-INF。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int MAXN=+;
const int INF=0x7fffffff;
vector<int> E[MAXN];
int fa[MAXN],dep[MAXN],size[MAXN],son[MAXN];
int top[MAXN],pos[MAXN];
int w[MAXN];
int cnt=,n;
int sum[MAXN<<],maxn[MAXN<<];
char str[]; /*线段树部分*/
void pushup(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
maxn[rt]=max(maxn[rt<<],maxn[rt<<|]);
} void modify(int pos,int delta,int l,int r,int rt)
{
if (l==r)
{
sum[rt]=maxn[rt]=delta;
return;
}
int m=(l+r)>>;
if (pos<=m) modify(pos,delta,lson);
if (pos>m) modify(pos,delta,rson);
pushup(rt);
} int query(int sign,int L,int R,int l,int r,int rt)
{
if (L<=l && r<=R)
{
if (sign==) return sum[rt];else return maxn[rt];
}
int m=(l+r)>>;
if (sign==)
{
int ret=;
if (L<=m) ret+=query(sign,L,R,lson);
if (R>m) ret+=query(sign,L,R,rson);
return ret;
}
else
{
int res=-INF;
if (L<=m) res=max(res,query(sign,L,R,lson));
if (R>m) res=max(res,query(sign,L,R,rson));
return res;
}
} /*树链剖分部分*/
void addedge(int u,int v)
{
E[u].push_back(v);
E[v].push_back(u);
} void dfs1(int u,int pre,int d)
{
fa[u]=pre;
dep[u]=d;
size[u]=;
int tmpmax=,hson=-;
for (int i=;i<E[u].size();i++)
{
int to=E[u][i];
if (to==pre) continue;
dfs1(to,u,d+);
if (size[to]>tmpmax)
{
tmpmax=size[to];
hson=to;
}
size[u]+=size[to];
}
son[u]=hson;
} void dfs2(int u,int t)
{
pos[u]=++cnt;
top[u]=t;
if (son[u]==-) return;
dfs2(son[u],t);
for (int i=;i<E[u].size();i++)
if (E[u][i]!=son[u] && E[u][i]!=fa[u]) dfs2(E[u][i],E[u][i]);
} int Que(int sign,int u,int v)
{
int ans;
if (sign==) ans=;else ans=-INF;
int f1=top[u],f2=top[v];
while (f1!=f2)
{
if (dep[f1]<dep[f2])
{
swap(f1,f2);
swap(u,v);
}
if (sign==) ans+=query(,pos[f1],pos[u],,n,);
else ans=max(ans,query(,pos[f1],pos[u],,n,));
u=fa[f1];
f1=top[u];
}
if (dep[u]>dep[v]) swap(u,v);
if (sign==) ans+=query(,pos[u],pos[v],,n,);
else ans=max(ans,query(,pos[u],pos[v],,n,));
return ans;
} /*主程序部分*/
void init()
{
scanf("%d",&n);
for (int i=;i<n-;i++)
{
int a,b;
scanf("%d%d",&a,&b);
addedge(a,b);
}
dfs1(,,);
dfs2(,);
} void get_ans()
{
for (int i=;i<=n;i++)
{
scanf("%d",&w[i]);
modify(pos[i],w[i],,n,);
}
int q;
scanf("%d",&q);
for (int i=;i<q;i++)
{
int u,v;
scanf("%s%d%d",str,&u,&v);
if (str[]=='C') modify(pos[u],v,,n,);
if (str[]=='Q' && str[]=='S') cout<<Que(,u,v)<<endl;
if (str[]=='Q' && str[]=='M') cout<<Que(,u,v)<<endl;
}
} int main()
{
init();
get_ans();
return ;
}

【树链剖分/线段树】BZOJ1036-[ZJOI2008]树的统计Count的更多相关文章

  1. 树链剖分【p2590】[ZJOI2008]树的统计

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

  2. 【bzoj1036】树的统计[ZJOI2008]树链剖分+线段树

    题目传送门:1036: [ZJOI2008]树的统计Count 这道题是我第一次打树剖的板子,虽然代码有点长,但是“打起来很爽”,而且整道题只花了不到1.5h+,还是一遍过样例!一次提交AC!(难道前 ...

  3. 【bzoj1036】[ZJOI2008]树的统计Count 树链剖分+线段树

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

  4. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  5. 树链剖分+线段树 BZOJ 1036 [ZJOI2008]树的统计Count

    题目链接 题意: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节 ...

  6. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  7. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  8. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  9. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  10. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

随机推荐

  1. bzoj 4879 失控的数位板 4881 线段游戏 贪心,瞎搞

    [Lydsy1705月赛]失控的数位板 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 148  Solved: 33[Submit][Status][ ...

  2. itext转html为pdf遇到的问题

    记录一下使用itext将html文件转为pdf文件遇到的一些问题 1.中文不显示 原因:itext默认不支持中文 解决方法:引入中文字体 需要注意的是在java代码中设置好中文字体后,还需要在html ...

  3. 用eval转化对象

    var str = '{"name": "tom","age": 12,"sex": "man"}' ...

  4. 【洛谷 P1645】 序列 (差分约束)

    题目链接 差分约束. 设\(s[i]\)表示前\(i\)个位置有多少个数,那么对于一个限制条件\((L,R,C)\),显然有 \[s[R]-s[L-1]>=C\] 于是连一条\(L-1\)到\( ...

  5. 关于dlib人脸对比,人脸识别

    人脸检测 人脸特征点提取 人脸对比,等于两张人脸对比,识别 封装的所有识别函数,直接看下面调用就好了. # coding:utf-8 ''' 本本次封装,我主要是做两张人脸对比. 就只人脸识别部分,简 ...

  6. mobius反演讲解

    mobius反演的基本形式为,假设知道函数F(x)=Σf(d) d|x,那么我们可以推出f(x)=Σmiu(d)*F(x/d) d|x,另一基本形式为假设知道函数F(x)=Σf(d) x|d,那么我们 ...

  7. twilio打电话和发短信

    # -*- coding: utf-8 -*- # @Time : 2018/03/09 14:53 # @Author : cxa # @File : call.py # @Software: Py ...

  8. Oracle基础 04 归档日志 archivelog

    --查看归档模式archive log list select log_mode from v$database; --修改为归档模式(mount下)alter database archivelog ...

  9. 区块链开发(六)truffle使用入门和testrpc安装

    在上篇博文中我们已经成功安装了truffle及所需相关环境,此篇就简单介绍一些truffle的使用及目录结构等. 简介truffle和testrpc truffle是本地的用来编译.部署智能合约的工具 ...

  10. python基础之初识python

    Python的发展史 1989年圣诞节期间,吉多·范罗苏姆为了打发时间,开发了python这门语言.真他妈牛逼. Python崇尚优美.清晰.简单,是一门优秀并广泛使用的语言.2007年在TIOBE榜 ...