75 pts 取模求助
查看原帖
75 pts 取模求助
654958
Light_az楼主2023/8/29 18:04

疑似取模问题,应该是算式出现了负数但是没发现 )

#include<bits/stdc++.h>
#define ll long long
#define F(i,j,n) for(ll i=j;i<=n;i++)
#define D double
#define Test ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
const int N=5e6+10;
ll n,m,k,x,y,u,v,w,cnt,ans,t,l,r,len,T,id,q;
ll mn=INT_MAX,mx=0,p=998244353,opt;
ll head[N],sz[N],dep[N],X[N],S[N];
struct Node{
	ll nxt,to,dis;
	ll u,v;
}tr[N];
void add(ll u,ll v,ll w){
	t++;
	tr[t].to=v;
	tr[t].dis=w;
	tr[t].u=u;
	tr[t].v=v;
	tr[t].nxt=head[u];
	head[u]=t;
}
void dfs1(ll u,ll fa){
	dep[u]=dep[fa]+1;
	sz[u]=1;
	for(ll i=head[u];i;i=tr[i].nxt){
		ll v=tr[i].to;
		if(v!=fa){
			dfs1(v,u);
			sz[u]+=sz[v];
			X[u]+=X[v]+sz[v]*tr[i].dis;
			X[u]%=p;
		}
	}
}
void dfs2(ll u,ll fa){
	for(ll i=head[u];i;i=tr[i].nxt){
		ll v=tr[i].to;
		if(v==fa) continue;
		S[v]=(X[u]+S[u])%p-(sz[v]*tr[i].dis%p)-X[v]+(n-sz[v])*tr[i].dis;
		S[v]%=p;
		dfs2(v,u);
	}
}
int main(){
	cin>>n>>q;
	F(i,1,n-1){
		cin>>u>>v>>w;
		w%=p;
		add(u,v,w);
		add(v,u,w);
	}
	dfs1(1,0);
	dfs2(1,0);
	F(i,1,t){
		if(dep[tr[i].v]<dep[tr[i].u]) ans+=(tr[i].dis*sz[tr[i].u])%p*(n-sz[tr[i].u])%p;
		else ans+=(tr[i].dis*sz[tr[i].v])%p*(n-sz[tr[i].v])%p;
		ans%=p;
	}
	F(i,1,q){
		cin>>id>>x;
		x%=p;
		cout<<(ans+2*((X[id]+S[id])%p+n*x)%p)%p<<"\n";
	}
	return 0;
}
2023/8/29 18:04
加载中...