求助,只过了样例
查看原帖
求助,只过了样例
237530
rzh123楼主2023/1/15 14:03
#include<bits/stdc++.h>
#define gc IO::fastgc()
#define pc(c)IO::fastpc(c)
typedef long long ll;typedef long long unsigned llu,ull;typedef long double lf;
using namespace std;
namespace IO{char ibuf[1<<23],obuf[1<<23],*ip1=ibuf,*ip2=ibuf,*o=obuf;inline char fastgc(){return((ip1==ip2)&&(ip2=(ip1=ibuf)+fread(ibuf,1,1<<21,stdin),ip1==ip2)?EOF:*ip1++);}inline void fastpc(char c){(o-obuf<(1<<22))?(*(o++)=c):(fwrite(obuf,o-obuf,1,stdout),o=obuf,*(o++)=c);}struct _{_(){}~_(){fwrite(obuf,o-obuf,1,stdout);}}__;}template<typename T>inline void read(T&t){t=0;T f=1;char c=gc;while(c!='-'&&(c<'0'||c>'9')){c=gc;}if(c=='-'){f=-1,c=gc;}while(c>='0'&&c<='9'){t=10*t+(c&15),c=gc;}t*=f;}template<>inline void read<string>(string&t){t="";char c=gc;while(isspace(c)||c==EOF){c=gc;}while(!(isspace(c)||c==EOF)){t+=c,c=gc;}}template<typename T>inline void write(T x){if(!x){return(void)pc('0');}if(x<0){pc('-'),x=-x;}static char c[33]={""};static int cc=0;while(x){c[++cc]=x%10,x/=10;}while(cc){pc(c[cc--]|48);}}inline void write(const string&x){for(auto c:x){pc(c);}}inline void write(const char*x){for(;*x;++x){pc(*x);}}inline void write(char _){pc(_);}template<typename T1,typename...Args>inline void read(T1&v1,Args&...args){read(v1),read(args...);}template<typename T1,typename...Args>inline void write(const T1&v1,const Args&...args){write(v1),write(args...);}
constexpr unsigned N=1e5+7,M=2e5+17,NN=4e5+37;
int n,m,a[N];
int ec,eh[N],nxt[M],to[M];
int dft,sz[N],fa[N],dep[N],dfn[N],pos[N],hs[N],tp[N],ed[N];
int f[N][2],g[N][2];
struct Matrix {
	static constexpr unsigned N=2;
	int n,m,a[N][N];
	inline void zero() {
		n=m=0;
		for(unsigned i {0}; i<N; ++i)for(unsigned j {0}; j<N; ++j) {
				a[i][j]=-0x3F3F3F3F;
			}
	}
	inline void unit(unsigned _) {
		n=m=_;
		for(unsigned i {0}; i<_; ++i)for(unsigned j {0}; j<_; ++j) {
				a[i][j]=(i==j)?0:(-0x3F3F3F3F);
			}
	}
	inline int*operator[](unsigned _) {
		return a[_];
	}
	inline const int*operator[](unsigned _)const {
		return a[_];
	}
	inline Matrix operator*(const Matrix&b)const {
		Matrix c;
		c.zero();
		c.n=n,c.m=b.m;
		for(int k {0}; k<m; ++k)for(int i {0}; i<n; ++i)for(int j {0}; j<b.m; ++j) {
					c[i][j]=max(c[i][j],a[i][k]+b[k][j]);
				}
		return c;
	}
};
inline void out(const Matrix&x){
	printf("[%d,%d,%d,%d]\n",x[0][0],x[0][1],x[1][0],x[1][1]);
}
namespace Seg{
	struct SegNode {
		int l,r;
		Matrix f;
	} tr[NN];
	inline void init(int k,int u){
		tr[k].f.zero(),tr[k].f.n=tr[k].f.m=2;
		tr[k].f[0][0]=tr[k].f[0][1]=g[u][0],tr[k].f[1][0]=g[u][1];
	}
	inline void pushup(int k){
		tr[k].f=tr[k<<1].f*tr[k<<1|1].f;
	}
	void build(int k,int l,int r){
		tr[k].l=l,tr[k].r=r;
		if(l==r) {
			init(k,pos[l]);
			return;
		}
		int m {(l+r)>>1};
		build(k<<1,l,m),build(k<<1|1,m+1,r),pushup(k);
	}
	void modify(int k,int x){
		if(tr[k].l>x||tr[k].r<x) {
			return;
		}
		if(tr[k].l==tr[k].r) {
			return init(k,pos[x]);
		}
		modify(k<<1,x),modify(k<<1|1,x);
		pushup(k);
	}
	Matrix query(int k,int l,int r){
		Matrix ret;
		ret.unit(2);
		if(tr[k].l>r||tr[k].r<l) {
			return ret;
		}
		if(tr[k].l>=l&&tr[k].r<=r) {
			return tr[k].f;
		}
		int m {(l+r)>>1};
		if(r<=m) {
			return query(k<<1,l,r);
		} else if(l>=m+1) {
			return query(k<<1|1,l,r);
		} else {
			return query(k<<1,l,r)*query(k<<1|1,l,r);
		}
	}
};
inline void _adde(int u,int v){
	nxt[++ec]=eh[u],to[ec]=v,eh[u]=ec;
}
inline void adde(int u,int v){
	_adde(u,v),_adde(v,u);
}
void dfs1(int u,int fa){
	::fa[u]=fa,dep[u]=dep[fa]+1,sz[u]=1;
	for(int i {eh[u]}; i; i=nxt[i]) {
		int v {to[i]};
		if(v==fa) {
			continue;
		}
		dfs1(v,u);
		sz[u]+=sz[v];
		if(!hs[u]||sz[v]>sz[hs[u]]) {
			hs[u]=v;
		}
	}
}
void dfs2(int u,int fa,int tpn){
	pos[dfn[u]=++dft]=u,tp[u]=tpn,ed[tpn]=max(ed[tpn],dft);
	if(hs[u]) {
		dfs2(hs[u],u,tpn);
	}
	for(int i {eh[u]}; i; i=nxt[i]) {
		int v {to[i]};
		if(v==fa||v==hs[u]) {
			continue;
		}
		dfs2(v,u,v);
	}
}
void dfs3(int u,int fa){
	f[u][0]=g[u][0]=0,f[u][1]=g[u][1]=a[u];
	if(hs[u]) {
		dfs3(hs[u],u);
		f[u][0]+=max(f[hs[u]][0],f[hs[u]][1]);
		f[u][1]+=f[hs[u]][0];
	}
	for(int i {eh[u]}; i; i=nxt[i]) {
		int v {to[i]};
		if(v==fa||v==hs[u]) {
			continue;
		}
		dfs3(v,u);
		f[u][0]+=max(f[v][0],f[v][1]);
		f[u][1]+=f[v][0];
		g[u][0]+=max(f[v][0],f[v][1]);
		g[u][1]+=f[v][0];
	}
}
inline void modify(int x,int v){
	g[x][1]+=(v-a[x]);
	a[x]=v;
	Matrix lst,tmp;
	while(x) {
		lst=Seg::query(1,dfn[tp[x]],ed[tp[x]]);
		Seg::modify(1,dfn[x]);
		tmp=Seg::query(1,dfn[tp[x]],ed[tp[x]]);
		x=fa[tp[x]];
		g[x][0]+=max(tmp[0][0],tmp[1][0])-max(lst[0][0],lst[1][0]);
		g[x][1]+=tmp[0][0]-lst[0][0];
	}
}
inline int query(){
	auto f=Seg::query(1,dfn[1],ed[1]);
	Matrix ret;
	ret.zero();
	ret.n=ret.m=2;
	ret[0][0]=ret[0][1]=0;
	ret=f;
	return max(ret[0][0],ret[1][0]);
}
signed main(){
	read(n,m);
	for(int i {1}; i<=n; ++i) {
		read(a[i]);
	}
	for(int i {1}; i<n; ++i) {
		int u,v;
		read(u,v);
		adde(u,v);
	}
	dfs1(1,0),dfs2(1,0,1),dfs3(1,0),
	Seg::build(1,1,dft);
	while(m--) {
		int x,y;
		read(x,y);
		modify(x,y);
		write(query(),'\n');
	}
	return 0;
}
2023/1/15 14:03
加载中...