给出一棵$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. Why is the ibdata1 file continuously growing in MySQL?

    We receive this question about the ibdata1 file in MySQL very often in Percona Support. The panic st ...

  2. Python3 urlparse

    >>> from urllib.parse import urlparse >>> o = urlparse('http://www.cwi.nl:80/%7Egu ...

  3. javascript实现瀑布流效果(固定宽度)

    HTML代码: <div id="content"> <div class="box"> <div class="img ...

  4. AtCoder Regular Contest 082 F

    Problem Statement We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contai ...

  5. 51nod 1040 最大公约数之和

    给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15   Input 1个数N(N <= ...

  6. 我在开发中所遇到的iOS7新特性以及iOS7与iOS6的适配问题总结

      ⓵UIImageView 1. // iOS7添加的对图像颜色处理的功能,过滤颜色的功能 2. _imageView.tintColor = [UIColor blueColor]; 3. //重 ...

  7. 培训补坑(day10:双指针扫描+矩阵快速幂)

    这是一个神奇的课题,其实我觉得用一个词来形容这个算法挺合适的:暴力. 是啊,就是循环+暴力.没什么难的... 先来看一道裸题. 那么对于这道题,显然我们的暴力算法就是枚举区间的左右端点,然后通过前缀和 ...

  8. KVM的ept机制

    转载:http://ytliu.info/blog/2014/11/24/shi-shang-zui-xiang-xi-de-kvm-mmu-pagejie-gou-he-yong-fa-jie-xi ...

  9. platform型设备在/dev目录下自动创建设备节点的分析【转】

    转自:http://blog.csdn.net/rockrockwu/article/details/7357648 系统启动过程中platform设备.驱动注册完毕,为什么在/dev目录下就自动创建 ...

  10. linux下源码安装netcat

    linux下源码安装netcat http://blog.chinaunix.net/uid-20783755-id-4211230.html 1,下载netcat源码,netcat-0.7.1-13 ...