点权树链剖分模板题。

# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi acos(-1.0)
# define eps 1e-
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
int Scan() {
int res=, flag=;
char ch;
if((ch=getchar())=='-') flag=;
else if(ch>=''&&ch<='') res=ch-'';
while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
return flag?-res:res;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
const int N=;
//Code begin... struct Edge{int p, next;}edge[N<<];
int head[N], cnt, node[N], n;
int seg[N<<][], fa[N], size[N], dep[N], p[N], top[N], son[N], pos; void add_edge(int u, int v){edge[cnt].p=v; edge[cnt].next=head[u]; head[u]=cnt++;}
void init(){cnt=; mem(son,-); pos=;}
void dfs(int x, int pre, int d)
{
fa[x]=pre; dep[x]=d; size[x]=;
for (int i=head[x]; i; i=edge[i].next) {
int v=edge[i].p;
if (v==pre) continue;
dfs(v,x,d+);
size[x]+=size[v];
if (son[x]==-||size[v]>size[son[x]]) son[x]=v;
}
}
void get_pos(int x, int sp)
{
top[x]=sp; p[x]=pos++;
if (son[x]==-) return ;
get_pos(son[x],sp);
for (int i=head[x]; i; i=edge[i].next) {
int v=edge[i].p;
if (v!=son[x]&&v!=fa[x]) get_pos(v,v);
}
}
void push_up(int p)
{
seg[p][]=max(seg[p<<][], seg[p<<|][]);
seg[p][]=seg[p<<][]+seg[p<<|][];
}
void update(int p, int l, int r, int L, int val)
{
if (L>r||L<l) return ;
if (L==l&&L==r) seg[p][]=seg[p][]=val;
else {
int mid=(l+r)>>;
update(lch,L,val); update(rch,L,val);
push_up(p);
}
}
int query(int p, int l, int r, int L, int R, int flag)
{
if (L>r||R<l) {
if (flag) return ;
else return -INF;
}
if (L<=l&&R>=r) return seg[p][flag];
int mid=(l+r)>>;
if (flag) return query(lch,L,R,flag)+query(rch,L,R,flag);
else return max(query(lch,L,R,flag),query(rch,L,R,flag));
}
int Qtree(int l, int r, int flag)
{
int f1=top[l], f2=top[r], ans;
if (flag) ans=;
else ans=-INF;
bool mark=false;
while (f1!=f2) {
mark=true;
if (dep[f1]<dep[f2]) swap(f1,f2), swap(l,r);
if (flag==) ans=max(ans,query(,,n,p[f1],p[l],flag));
else ans+=query(,,n,p[f1],p[l],flag);
l=fa[f1]; f1=top[l];
}
if (dep[l]>dep[r]) swap(l,r);
if (flag==) ans=max(ans,query(,,n,p[l],p[r],flag));
else ans+=query(,,n,p[l],p[r],flag);
return ans;
}
int main ()
{
int u, v, q, l, r;
char flag[];
init();
scanf("%d",&n);
FO(i,,n) scanf("%d%d",&u,&v), add_edge(u,v), add_edge(v,u);
dfs(,,);
get_pos(,);
FOR(i,,n) scanf("%d",node+i), update(,,n,p[i],node[i]);
scanf("%d",&q);
while (q--) {
scanf("%s%d%d",flag,&l,&r);
if (flag[]=='C') update(,,n,p[l],r);
else printf("%d\n",Qtree(l,r,flag[]=='S'));
}
return ;
}

BZOJ 1036 树的统计(树链剖分)的更多相关文章

  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. BZOJ 1036 树的统计-树链剖分

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

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

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

  5. BZOJ.3252.攻略(贪心 长链剖分/线段树)

    题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. ...

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

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

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

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

  8. zjoi 2008 树的统计——树链剖分

    比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护——比如求路径和的话——随着他们各自的链向上走, ...

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

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

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

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

随机推荐

  1. linux下Intellij Idea 14的安装

    一.安装配置jdk                                                         虽然很多Linux发行版现在已经自带OpenJDK,但是在开发过程中 ...

  2. SDWebImage的原理 和 实现机制 --- tableView 滑动卡的问题

    一.原理 1)当我门需要获取网络图片的时候,我们首先需要的便是URl没有URl什么都没有,获得URL后我们SDWebImage实现的并不是直接去请求网路,而是检查图片缓存中有没有和URl相关的图片,如 ...

  3. Net Core学习笔记

    Net Core 官网:https://dotnet.github.io/ Net Core Api: https://docs.microsoft.com/en-us/dotnet/api/?vie ...

  4. 如何在Mac OS系统下搭建Java开发环境 配置Java环境变量

    1. 打开终端   在finder里面搜索(这台MAC)查找终端   2. 在cdlouiedeAir:~ cdlouie$(cdlouie是我的电脑用户名) 后面输入sudo vim /etc/pr ...

  5. hdu1907John(反nim博弈)

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  6. Linux命令应用大词典-第8章 日期和时间

    8.1 cal:显示日历信息 8.2 date:显示和设置系统日期和时间 8.3 hwclock:查看和设置硬件时钟 8.4 clock:查看和设置硬件时钟 8.5 clockdiff:主机之间测量时 ...

  7. Java应用基础微专业-设计篇

    第1章--抽象与接口 1.1 抽象 An abstract class can be created without abstract methods, the purpose of doing th ...

  8. python 终极篇 --- form组件 与 modelForm

                                                           form组件                                       ...

  9. 机器学习-支持向量机SVM

    简介: 支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型.他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的 ...

  10. QT打开文件路径中含有中文和空格问题

    使用qt-mingw版做的软件,发给客户以后说工作不正常,配置文件无法打开,或者加载数据文件不正常.远程查看以后,发现客户经常将程序放置在中文带空格的路径下,导致文件打开不正常.所以最近想在程序上解决 ...