完美的30pts求调
查看原帖
完美的30pts求调
551133
liuliucy楼主2023/8/19 18:26
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct xx{
	int x,y,nxt;
}e[1000001];
int f[1000001][2];
const int inf=0x3f3f3f3f3f3f3f3f;
struct matr{
	int a[3][3];
	matr(){
		memset(a,~0x3f,sizeof(a));
	}
	friend matr operator *(matr a,matr b){
		matr c;
		memset(c.a,0,sizeof(c.a));
		for(int i=1;i<=2;i++){
			for(int j=1;j<=2;j++){
				for(int k=1;k<=2;k++){
					c.a[i][j]=max(c.a[i][j],a.a[i][k]+b.a[k][j]);
				}
			}
		}
        return c;
	}
	void print(){
		putchar('\n');
		for(int i=1;i<=2;i++,putchar('\n'))
			for(int j=1;j<=2;j++)printf("%d ",a[i][j]);
		putchar('\n');
	}
}tree[1000001],v[1000001];
struct tre{
	int siz,son,ed,fa,top,a,dfn;
}a[1000001];
int head[1000001],cnt,n,m;
int ct=0,idfn[1000001];
void add(int a,int b){
	e[++cnt].x=a;
	e[cnt].y=b;
	e[cnt].nxt=head[a];
	head[a]=cnt;
}
void pushup(int rt){
	tree[rt]=tree[rt<<1]*tree[rt<<1|1];
}
void build(int rt,int l,int r){
	if(l==r){
		tree[rt]=v[idfn[l]];
		return;
	}
	int mid=l+r>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	pushup(rt);
}
void update(int rt,int l,int r,int x){
	if(l==r){
		tree[rt]=v[idfn[x]];
		return ;
	}
	int mid=l+r>>1;
	if(mid>=x)update(rt<<1,l,mid,x);
	else update(rt<<1|1,mid+1,r,x);
	pushup(rt);
}
matr query(int rt,int l,int r,int x,int y){
//	printf("%d %d %d %d\n",l,r,x,y);
	if(x<=l&&r<=y){
		return tree[rt];
	}
	int mid=l+r>>1;
   	if (x>mid)return query(rt<<1|1,mid+1,r,x,y);
    if (y<=mid)return query(rt<<1,l,mid,x,y);
    return query(rt<<1,l,mid,x,y)*query(rt<<1|1,mid+1,r,x,y);
//	if(mid<y)k=k*query(rt<<1,mid+1,r,x,y);
//	if(mid>=x)k=k*query(rt<<1|1,l,mid,x,y);
//	return k;
}
void modify(int x,int y){
	v[x].a[2][1]+=y-a[x].a;
	a[x].a=y;
	matr lst,nxt;
	while(x){
		lst=query(1,1,n,a[a[x].top].dfn,a[a[x].top].ed);
		update(1,1,n,a[x].dfn);
		nxt=query(1,1,n,a[a[x].top].dfn,a[a[x].top].ed);
		x=a[a[x].top].fa;
		v[x].a[1][1]+=max(nxt.a[1][1],nxt.a[2][1])-max(lst.a[2][1],lst.a[1][1]);
		v[x].a[1][2]=v[x].a[1][1];
		v[x].a[2][1]+=nxt.a[1][1]-lst.a[1][1];
//		v[x].print();
	}
}
void dfs1(int x,int fa){
	a[x].siz=1;a[x].fa=fa;
	for(int i=head[x];i;i=e[i].nxt){
		int y=e[i].y;
		if(y==fa)continue;
		dfs1(y,x);
		a[x].siz+=a[y].siz;
		if(a[y].siz>a[a[x].son].siz)a[x].son=y;
	}
}
void dfs2(int x,int top){
//	printf("%d ",x);
	a[x].top=top;
	a[x].dfn=++ct;
	idfn[ct]=x;
	a[top].ed=max(a[top].ed,ct);
	f[x][0]=0;f[x][1]=a[x].a;
	v[x].a[1][1]=v[x].a[1][2]=0;
	v[x].a[2][1]=a[x].a;v[x].a[2][2]=-inf;
	if(a[x].son){
		dfs2(a[x].son,top);
		f[x][0]+=max(f[a[x].son][1],f[a[x].son][0]);
		f[x][1]+=f[a[x].son][0];
	}
	for(int i=head[x];i;i=e[i].nxt){
		int y=e[i].y;
		if(y==a[x].fa||y==a[x].son)continue;
		dfs2(y,y);
		f[x][0]+=max(f[y][0],f[y][0]);
		f[x][1]+=f[y][0];
		v[x].a[1][1]+=max(f[y][0],f[y][1]);
		v[x].a[1][2]=v[x].a[1][1];
		v[x].a[2][1]+=f[y][0];
	}
//	v[x].print();
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i].a);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%lld%lld",&x,&y);
		add(x,y);add(y,x);
	}
	dfs1(1,0);
	dfs2(1,1);
// 	for(int i=1;i<=n;i++)printf("%d ",a[i].ed);
//	putchar('\n');
	build(1,1,n);
	while(m--){
		int x,y;
		scanf("%lld%lld",&x,&y);
		modify(x,y);
		matr ans=query(1,1,n,a[1].dfn,a[1].ed);
		printf("%lld\n",max(ans.a[1][1],ans.a[2][1]));
	}
}
2023/8/19 18:26
加载中...