Tree Of Trees Solution
Below Solutions Available in C++
#include<bits/stdc++.h>
#define MOD 998244353
#define int long long
using namespace std;
struct Tree {
vector<vector<pair<int,int>>> a;
vector<int> nm,sm,mx,su,cs;
int n,ans1=2147483647,ans2=0;
void init() {
cin >> n;
a.resize(n+1);cs.resize(n+1);
nm.resize(n+1);sm.resize(n+1);
mx.resize(n+1);su.resize(n+1);
for(int i=0;i<=n;++i) {
nm[i]=sm[i]=mx[i]=cs[i]=su[i]=0;
a[i].clear();
}
int x,y,z;
for(int i=1;i<n;++i) {
cin >> x >> y >> z;
a[x].push_back({y,z});
a[y].push_back({x,z});
}
}
void dfs1(int p,int fa) {
su[p]=1;cs[p]=0;mx[p]=0;
for(auto to:a[p]) {
if(to.first==fa) continue;
dfs1(to.first,p);
su[p]+=su[to.first];
mx[p]=max(mx[p],su[to.first]);
cs[p]+=cs[to.first]+su[to.first]*to.second;
}
mx[p]=max(mx[p],n-su[p]);
}
void dfs2(int p,int fa) {
for(auto to:a[p]) {
if(to.first==fa) continue;
dfs2(to.first,p);
int T=(sm[to.first]+nm[to.first]*to.second)%MOD;
ans2+=(T*nm[p]%MOD+sm[p]*nm[to.first]%MOD)%MOD;
nm[p]+=nm[to.first];
sm[p]=(sm[p]+T)%MOD;
}
nm[p]++;
}
void solve() {
init();
dfs1(1,0);
int um=n,x=0;
for(int i=1;i<=n;++i)
if(mx[i]<um) {
um=mx[i];x=i;
}
dfs1(x,0);
ans1=cs[x]%MOD;
dfs2(1,0);
for(int i=1;i<=n;++i) ans2=(ans2+sm[i])%MOD;
}
};
Tree T[10001];
int n,a[10001],answer,sum;
vector<int> e,q;
signed main() {
cin >> n;
for(int i=1;i<=n;++i) {
T[i].solve();
sum+=T[i].n;
q.push_back(T[i].n);
}
for(int i=1,x;i<n;++i) {
cin >> x;
e.push_back(x);
}
sort(e.begin(),e.end());
sort(q.begin(),q.end());
reverse(e.begin(),e.end());
for(int i=1;i<=n;++i)
answer=(answer+T[i].ans2+T[i].ans1*(sum-T[i].n)%MOD)%MOD;
for(int i=0;i<n-1;++i)
answer=(answer+q[i]*(sum-q[i])%MOD*e[i])%MOD;
cout << answer << endl;
}
#include<bits/stdc++.h>
#define MOD 998244353
#define int long long
using namespace std;
struct Tree {
vector<vector<pair<int,int>>> a;
vector<int> nm,sm,mx,su,cs;
int n,ans1=2147483647,ans2=0;
void init() {
cin >> n;
a.resize(n+1);cs.resize(n+1);
nm.resize(n+1);sm.resize(n+1);
mx.resize(n+1);su.resize(n+1);
for(int i=0;i<=n;++i) {
nm[i]=sm[i]=mx[i]=cs[i]=su[i]=0;
a[i].clear();
}
int x,y,z;
for(int i=1;i<n;++i) {
cin >> x >> y >> z;
a[x].push_back({y,z});
a[y].push_back({x,z});
}
}
void dfs1(int p,int fa) {
su[p]=1;cs[p]=0;mx[p]=0;
for(auto to:a[p]) {
if(to.first==fa) continue;
dfs1(to.first,p);
su[p]+=su[to.first];
mx[p]=max(mx[p],su[to.first]);
cs[p]+=cs[to.first]+su[to.first]*to.second;
}
mx[p]=max(mx[p],n-su[p]);
}
void dfs2(int p,int fa) {
for(auto to:a[p]) {
if(to.first==fa) continue;
dfs2(to.first,p);
int T=(sm[to.first]+nm[to.first]*to.second)%MOD;
ans2+=(T*nm[p]%MOD+sm[p]*nm[to.first]%MOD)%MOD;
nm[p]+=nm[to.first];
sm[p]=(sm[p]+T)%MOD;
}
nm[p]++;
}
void solve() {
init();
dfs1(1,0);
int um=n,x=0;
for(int i=1;i<=n;++i)
if(mx[i]<um) {
um=mx[i];x=i;
}
dfs1(x,0);
ans1=cs[x]%MOD;
dfs2(1,0);
for(int i=1;i<=n;++i) ans2=(ans2+sm[i])%MOD;
}
};
Tree T[10001];
int n,a[10001],answer,sum;
vector<int> e,q;
signed main() {
cin >> n;
for(int i=1;i<=n;++i) {
T[i].solve();
sum+=T[i].n;
q.push_back(T[i].n);
}
for(int i=1,x;i<n;++i) {
cin >> x;
e.push_back(x);
}
sort(e.begin(),e.end());
sort(q.begin(),q.end());
reverse(e.begin(),e.end());
for(int i=1;i<=n;++i)
answer=(answer+T[i].ans2+T[i].ans1*(sum-T[i].n)%MOD)%MOD;
for(int i=0;i<n-1;++i)
answer=(answer+q[i]*(sum-q[i])%MOD*e[i])%MOD;
cout << answer << endl;
}
Comments
Post a Comment