给出一棵$N$个节点的无根树,节点$i$有权值$v_i$。现在有$M$次操作,操作有如下两种:

$1\ x\ y$ 将节点$x$的权值$v_x$修改为$y$

$2$ 选择一个联通块(也可以不选择),使得点权和最大。输出这个点权和

树剖==

考虑先做一次DP,$f_x$表示在以$x$为根的子树中,选择$x$的情况下的最大联通块和,那么$f_x=v_x+\sum\limits_{u\in son_x}\max(f_u,0)$($v_x$表示点$x$的权值)

然后树剖,每一个点的权值设为$f_x-f_{heavy_x}$($heavy_x$表示点$x$的重儿子),然后可以发现,对于一条重链所代表的区间,求最大子段和就是这条链上所有点的最大答案

为了避免不同重链之间互相影响,我们可以在重链之间加上一个空节点,权值为$-\infty$

考虑修改,修改一个点只会影响它沿重链往上跳时经过的(重链顶端节点的父亲节点),所以我们只需要修改重链顶端的父亲节点就好了

#include<stdio.h>
typedef long long ll;
const ll inf=1000000000ll;
ll max(ll a,ll b){return a>b?a:b;}
struct zt{
	ll s,ms,ls,rs;
}f[400010];
zt merge(zt l,zt r){
	zt c;
	c.s=l.s+r.s;
	c.ls=max(l.ls,l.s+r.ls);
	c.rs=max(r.rs,r.s+l.rs);
	c.ms=max(max(l.ms,r.ms),l.rs+r.ls);
	return c;
}
void pushup(int x){f[x]=merge(f[x<<1],f[x<<1|1]);}
ll p[200010];
void build(int l,int r,int x){
	if(l==r){
		f[x].s=p[l];
		f[x].ms=f[x].ls=f[x].rs=max(p[l],0);
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	pushup(x);
}
void modify(int p,ll v,int l,int r,int x){
	if(l==r){
		f[x].s+=v;
		f[x].ms=f[x].ls=f[x].rs=max(f[x].s,0);
		return;
	}
	int mid=(l+r)>>1;
	if(p<=mid)
		modify(p,v,l,mid,x<<1);
	else
		modify(p,v,mid+1,r,x<<1|1);
	pushup(x);
}
zt query(int L,int R,int l,int r,int x){
	if(L<=l&&r<=R)return f[x];
	int mid=(l+r)>>1;
	if(R<=mid)return query(L,R,l,mid,x<<1);
	if(L>mid)return query(L,R,mid+1,r,x<<1|1);
	return merge(query(L,R,l,mid,x<<1),query(L,R,mid+1,r,x<<1|1));
}
int h[100010],nex[200010],to[200010],v[100010],fa[100010],siz[100010],son[100010],bl[100010],pos[100010],M;
ll dp[100010];
void add(int a,int b){
	M++;
	to[M]=b;
	nex[M]=h[a];
	h[a]=M;
}
void dfs(int x){
	int i,mx=0,k=0;
	siz[x]=1;
	dp[x]=v[x];
	for(i=h[x];i;i=nex[i]){
		if(to[i]!=fa[x]){
			fa[to[i]]=x;
			dfs(to[i]);
			dp[x]+=max(dp[to[i]],0);
			siz[x]+=siz[to[i]];
			if(siz[to[i]]>mx){
				mx=siz[to[i]];
				k=to[i];
			}
		}
	}
	son[x]=k;
}
void dfs(int x,int chain){
	pos[x]=++M;
	bl[x]=chain;
	if(son[x]){
		dp[x]-=max(dp[son[x]],0);
		dfs(son[x],chain);
	}
	p[pos[x]]=dp[x];
	for(int i=h[x];i;i=nex[i]){
		if(to[i]!=fa[x]&&to[i]!=son[x]){
			M++;
			p[M]=-inf;
			dfs(to[i],to[i]);
		}
	}
}
void modify(int x,ll d){
	d-=v[x];
	v[x]+=d;
	ll t1,t2;
	while(x){
		t1=query(pos[bl[x]],M,1,M,1).ls;
		modify(pos[x],d,1,M,1);
		t2=query(pos[bl[x]],M,1,M,1).ls;
		d=t2-t1;
		x=fa[bl[x]];
	}
}
int main(){
	int n,m,i,x,y;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%d",v+i);
	for(i=1;i<n;i++){
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);
	}
	dfs(1);
	M=0;
	dfs(1,1);
	build(1,M,1);
	while(m--){
		scanf("%d",&i);
		if(i==1){
			scanf("%d%d",&x,&y);
			modify(x,y);
		}else
			printf("%d\n",f[1].ms);
	}
}

[xsy1294]sub的更多相关文章

  1. 【XSY1294】sub 树链剖分

    题目描述 给你一棵\(n\)个点的无根树,节点\(i\)有权值\(v_i\).现在有\(m\)次操作,操作有如下两种: \(1~x~y\):把\(v_x\)改成\(y\). \(2\):选择一个连通块 ...

随机推荐

  1. 洛谷P1282 多米诺骨牌 (DP)

    洛谷P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中 ...

  2. bzoj 2525 [Poi2011]Dynamite 二分+树形dp

    [Poi2011]Dynamite Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 270  Solved: 138[Submit][Status][D ...

  3. 买卖股票的最佳时机 [ leetcode ]

    原题地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/description/ 给定一个数组,它的第 i 个 ...

  4. pip 使用国内源

    常用国内的pip源如下:阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple ...

  5. 在线输入RGB更改背景色

    HTML: <!DOCTYPE html><html> <head> <meta http-equiv="Content-Type" co ...

  6. 最适合初学者学习的idea教程

    https://github.com/judasn/IntelliJ-IDEA-Tutorial

  7. Eclipse+Tomcat实现热部署/热加载配置,修改java代码无需重启tomcat

    一.Tomcat热加载配置 Eclipse Package Explorer中找到Servers,点击你所需要运行的tomcat的config配置文件,例如 demo-config,双击该文件夹下的s ...

  8. 【poj3693-重复次数最多的连续重复子串】后缀数组

    题意:给定一个串,长度<=10^5,求它重复次数最多的连续重复子串(输出字典序最小的那个). 例如ccabcabc,答案就是abcabc 一开始没想清楚,结果调了好久. 原理: 按照L划分,因为 ...

  9. Bzoj1313 [HAOI2008]下落的圆盘

    有 n 个圆盘从天而降,后面落下的可以盖住前面的.最后按掉下的顺序,在平面上依次测得每个圆盘的圆心和半径,问下落完成后从上往下看,整个图形的周长是多少,即你可以看到的圆盘的轮廓的圆盘的轮廓总长.例如下 ...

  10. JVM指令的使用深入详解

    原文地址:https://www.jb51.net/article/155293.htm 一.未归类系列A 此系列暂未归类. 指令码    助记符                            ...