社区讨论

玄关求条

P4719【模板】动态 DP参与者 4已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhjrlyb8
此快照首次捕获于
2025/11/04 07:22
4 个月前
此快照最后确认于
2025/11/04 07:22
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;

const int N=200010;

int n,m,a[N],u,v,x,y,dfn[N],fan[N],son[N],dep[N],fa[N],siz[N],top[N],id,F[N][2],las[N];

vector<int> f[N]; 

struct jcd{
	int m[2][2];
	jcd(){memset(m,-0x3f,sizeof m);}
	jcd operator *(jcd b)const{
		jcd c;
		for(int i=0;i<2;i++)
		for(int j=0;j<2;j++)
		for(int k=0;k<2;k++)
		c.m[i][j]=max(c.m[i][j],m[i][k]+b.m[k][j]);
		return c;
	}
}g[N];

struct tr{
	int l[N<<2],r[N<<2];
	jcd ans[N<<2];
	void push(int p){
		ans[p]=ans[p<<1]*ans[p<<1|1];
	}
	void build(int p,int l1,int r1){
		l[p]=l1;r[p]=r1;
		if(l1==r1){
			ans[p]=g[fan[l[p]]];
			return ;
		}
		int mid=(l1+r1)>>1;
		build(p<<1,l1,mid);
		build(p<<1|1,mid+1,r1);
		push(p);
	}
	jcd query(int p,int l1,int r1){
//		cout<<p<<" "<<l[p]<<" "<<r[p]<<endl;
		if(l[p]==l1&&r[p]==r1){
			return ans[p];
		}
		int mid=(l[p]+r[p])>>1;
		if(l1>mid)return query(p<<1|1,l1,r1);
		else if(r1<=mid)return query(p<<1,l1,r1);
		else return query(p<<1|1,mid+1,r1)*query(p<<1,l1,mid);
	}
	
	void gai(int p,int k){
		if(l[p]==r[p]&&l[p]==k){
			ans[p]=g[fan[k]];
			return ;
		}
		int mid=(l[p]+r[p])>>1;
		if(k<=mid)gai(p<<1,k);
		else gai(p<<1|1,k);
		push(p); 
	}
}T;

void dfs(int p,int f1){
	dep[p]=dep[f1]+1;siz[p]=1;
	for(int op:f[p]){
		if(op==f1)continue;
		fa[op]=p;dfs(op,p);
		siz[p]+=siz[op];
		if(siz[son[p]]<siz[op])
		son[p]=op;
	}
}

void dfs1(int p,int tp){
	dfn[p]=++id;fan[id]=p;
	top[p]=tp;las[tp]=max(las[tp],id);
	F[p][0]=0;F[p][1]=a[p];
	g[p].m[0][0]=g[p].m[0][1]=0;
	g[p].m[1][0]=a[p];
	if(son[p]){
		dfs1(son[p],tp);
		F[p][0]+=max(F[son[p]][0],F[son[p]][1]);
		F[p][1]+=F[son[p]][0];
	}
	for(int op:f[p]){
		if(op==fa[p]||op==son[p])continue;
		dfs1(op,op);
		F[p][0]+=max(F[op][0],F[op][1]);
		F[p][1]+=F[op][0];
		g[p].m[0][0]+=max(F[op][0],F[op][1]);
		g[p].m[0][1]=g[p].m[0][0];
		g[p].m[1][0]+=F[op][0];
	}
}

void up(int p,int y){
	g[p].m[1][0]+=y-a[p];
	a[p]=y;jcd qian,hou;
	while(p){
//		cout<<p<<":"<<dfn[top[p]]<<" "<<las[top[p]]<<endl;
		qian=T.query(1,dfn[top[p]],las[top[p]]);
		T.gai(1,dfn[p]);
		hou=T.query(1,dfn[top[p]],las[top[p]]);
		p=fa[top[p]];
		g[p].m[0][0]+=max(hou.m[0][0],hou.m[1][0])-max(qian.m[0][0],qian.m[1][0]);
		g[p].m[0][1]=g[p].m[0][0];
		g[p].m[1][0]+=hou.m[0][0]-qian.m[0][0];
	}
	
}

void init(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	for(int i=1;i<n;i++){
		cin>>u>>v;
		f[u].push_back(v);
		f[v].push_back(u);
	}
	dfs(1,1);dfs1(1,1);
	T.build(1,1,n);
	jcd F1=T.query(1,dfn[1],las[1]);
	cout<<max(F1.m[0][0],F1.m[1][0])<<"\n";
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		up(x,y);
		jcd F1=T.query(1,dfn[1],las[1]);
		cout<<max(F1.m[0][0],F1.m[1][0])<<"\n";
	}
}

int main(){
	init();
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...