警示后人,式子中有减法一定记得加负数取模
查看原帖
警示后人,式子中有减法一定记得加负数取模
755359
Uridine_楼主2023/8/27 09:06
#include<iostream>
#include<cstdio>
#include<list>

const int maxn = 200050;
const int mod = 998244353;

using namespace std;

list<pair<int,  long long>>edge[maxn];
long long dpu[maxn];
long long dpd[maxn];
long long dnn[maxn];

void dfsd(int now, int las, int n)
{
   dnn[now] = 1;
   for (auto& next : edge[now])
   {
   	if (next.first == las)continue;
   	dfsd(next.first, now, n);
   	dpd[now] += dpd[next.first] + dnn[next.first] * next.second;
   	dpd[now] %= mod;
   	dnn[now] += dnn[next.first];
   }
}
void dfsu(int now, int las,int n)
{
   if (las == -1) dpu[now] = dpd[now];
   for (auto& next : edge[now])
   {
   	if (next.first == las)continue;
   	dpu[next.first] = (((dpu[now] % mod) - ((2 * dnn[next.first] * next.second) % mod) + mod) % mod) + n * next.second;
   	dpu[next.first] %= mod;
   	dfsu(next.first, now, n);
   }
}

int main()
{
   int n, q; cin >> n >> q;
   for (int i = 1; i <= n-1; i++)
   {
   	int a, b, v; cin >> a >> b >> v;
   	edge[a].push_back({ b,v });
   	edge[b].push_back({ a,v });
   }
   dfsd(1, -1, n);
   dfsu(1, -1, n);
   long long sum = 0;
   for (int i = 1; i <= n; i++)
   {
   	sum += dpu[i];
   	sum %= mod;
   }
   for (int i = 1; i <= q; i++)
   {
   	int k, w; cin >> k >> w;
   	long long ans = sum + (dpu[k] + static_cast<long long>(n) * w )* 2;
   	ans %= mod;
   	cout << ans << endl;
   }
}
2023/8/27 09:06
加载中...