本蒟蒻样例过了,但是15pts,求助!(树形dp)
查看原帖
本蒟蒻样例过了,但是15pts,求助!(树形dp)
677143
dream_contry楼主2024/8/7 10:05
#include<bits/stdc++.h>
using namespace std;

const int N=1e6+5,mod=998244353;
vector<pair<int,int>> tree[N];
int sz[N],f[N];
bool vis[N];
int n,q;

void dfs1(int u,int fa){
	sz[u]=1;
	for(auto it:tree[u]){
		int v=it.first;
		int w=it.second;
		if(v==fa) continue;
		dfs1(v,u);
		sz[u]+=sz[v];
		f[u]=f[u]+f[v]+sz[v]*w%mod;
		f[u]=f[u]%mod;
	}
}

void dfs2(int u){
	vis[u]=1;
	for(auto it:tree[u]){
		int v=it.first;
		int w=it.second;
		if(!vis[v]){
			f[v]=f[u]+(n-(2*sz[v])%mod)*w;
			f[v]=(f[v]+mod)%mod;
			dfs2(v);
		}
	}
}

int main(){
	cin>>n>>q;
	for(int i=1;i<n;i++){
		int u,v,w;
		cin>>u>>v>>w;
		tree[u].push_back({v,w});
		tree[v].push_back({u,w});
	}
	
	dfs1(1,0);
	dfs2(1);
	
	int now=0;
	for(int i=1;i<=n;i++){
		now+=f[i];
		now=now%mod;
	}
	
	int ans=now%mod;
	for(int i=1;i<=q;i++){
		ans=now%mod;
		int u,w;
		cin>>u>>w;
		ans=ans+2*w*n+2*f[u];
		cout<<ans%mod<<endl;
	}
	
	return 0;
}
2024/8/7 10:05
加载中...