WA 后七个点并荣获 30 分,求调
查看原帖
WA 后七个点并荣获 30 分,求调
464732
luqyou楼主2024/8/19 17:19
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define fi first
#define sc second
#define pii pair<int,int>
#define pb push_back
const int maxn=1e5+10;
const int inf=1e9;
int n,m,w[maxn],sz[maxn],son[maxn],tp[maxn],ed[maxn],dfn[maxn],dep[maxn],cnt,dp[maxn][2],f[maxn];
vector<int> g[maxn];
struct mat{
	int n,a[3][3];
	void init(int x){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++) a[i][j]=x;
		}
	}
	void getI(){
		init(-inf);
		for(int i=1;i<=n;i++) a[i][i]=0;
	}
	mat operator *(mat x){
		mat ans;
		ans.n=n,ans.init(-inf);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				for(int k=1;k<=n;k++){
					ans.a[i][j]=max(ans.a[i][j],a[i][k]+x.a[k][j]);
				}
			}
		}
		return ans;
	} 
	void output(){
		cout<<"----MATRIXS----"<<endl;
		for(int i=1;i<=n;i++,cout<<endl){
			for(int j=1;j<=n;j++) cout<<a[i][j]<<" ";
		}
		cout<<"------END------"<<endl;
	}
}val[maxn],I;
struct node{
	int l,r;
	mat s;
}tr[maxn*4]; 
int ls(int u){
	return (u<<1);
}
int rs(int u){
	return (u<<1)|1;
}
bool ir(int L,int R,int l,int r){
	return (L<=l)&&(r<=R); 
}
bool ofr(int L,int R,int l,int r){
	return (R<l)||(r<L);
}
void dfs1(int u,int fa){
	sz[u]=1,dep[u]=dep[fa]+1,dp[u][1]=w[u],f[u]=fa;
	for(int v:g[u]){
		if(v!=fa){
			dfs1(v,u),sz[u]+=sz[v];
			if(sz[v]>sz[son[u]]) son[u]=v; 
			dp[u][0]+=max(dp[v][0],dp[v][1]);
			dp[u][1]+=dp[v][0];
		}
	}
}
void dfs2(int u,int fa,int top){
	tp[u]=top,dfn[u]=++cnt,val[dfn[u]].n=2;
	if(son[u]) dfs2(son[u],u,top);
	val[dfn[u]].a[2][2]=-inf,val[dfn[u]].a[1][2]=w[u];
	for(int v:g[u]){
		if(v!=fa&&v!=son[u]){
			dfs2(v,u,v);
			val[dfn[u]].a[1][1]+=max(dp[v][0],dp[v][1]);
			val[dfn[u]].a[2][1]+=max(dp[v][0],dp[v][1]);
			val[dfn[u]].a[1][2]+=dp[v][0];
		}
	}
	if(!son[u]) ed[u]=u;
	else ed[u]=ed[son[u]];
}
void pushup(int u){
	if(tr[u].l==tr[u].r) return ;
	tr[u].s=tr[ls(u)].s*tr[rs(u)].s;
}
void build(int u,int l,int r){
	tr[u].l=l,tr[u].r=r;
	if(l==r) return tr[u].s=val[l],void();
	int mid=(l+r)>>1;
	build(ls(u),l,mid),build(rs(u),mid+1,r),pushup(u);
}
void upd(int u,int x,mat k){
	if(tr[u].l==tr[u].r) return tr[u].s=k,void();
	int mid=(tr[u].l+tr[u].r)>>1;
	if(x<=mid) upd(ls(u),x,k);
	else upd(rs(u),x,k);
	pushup(u); 
}
mat query(int u,int l,int r){
	if(ir(l,r,tr[u].l,tr[u].r)) return tr[u].s;
	else if(!ofr(l,r,tr[u].l,tr[u].r)) return query(ls(u),l,r)*query(rs(u),l,r);
	else return I;
}
void cover(int u,int k){
	val[dfn[u]].a[1][2]-=w[u],w[u]=k,val[dfn[u]].a[1][2]+=w[u];
	while(u){
		mat m1=query(1,dfn[tp[u]],dfn[ed[u]]),m2;
		upd(1,dfn[u],val[dfn[u]]),m2=query(1,dfn[tp[u]],dfn[ed[u]]);
		u=f[tp[u]];
		/*
		[fi,0 fi,1]
		[fi,0 -inf]
		*/
		val[dfn[u]].a[1][1]-=max(m1.a[1][1],m1.a[1][2]);
		val[dfn[u]].a[1][1]+=max(m2.a[1][1],m2.a[1][2]);
		val[dfn[u]].a[2][1]=val[dfn[u]].a[1][1];
		val[dfn[u]].a[1][2]-=m1.a[1][1];
		val[dfn[u]].a[1][2]+=m2.a[1][1];
	}
	
}
void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>w[i],w[i]=max(w[i],0ll);
	for(int i=1,u,v;i<n;i++) cin>>u>>v,g[u].pb(v),g[v].pb(u);
	dfs1(1,0),dfs2(1,0,1),build(1,1,n);
//	for(int i=1;i<=n;i++) cout<<tp[i]<<" ";
//	cout<<endl;
	while(m--){
		int x,y;
		cin>>x>>y;
		cover(x,max(y,0ll));
		mat res=query(1,1,dfn[ed[1]]);
		cout<<max(res.a[1][1],res.a[1][2])<<endl;
	}
}
signed main(){
	freopen("P4719_4.in","r",stdin);
	freopen("out.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t=1;
//    cin>>t;
	I.n=2,I.getI();
    while(t--) solve();
    return 0;
}
2024/8/19 17:19
加载中...