結果
問題 | No.2949 Product on Tree |
ユーザー |
![]() |
提出日時 | 2024-10-26 03:43:22 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 287 ms / 2,000 ms |
コード長 | 2,717 bytes |
コンパイル時間 | 7,443 ms |
コンパイル使用メモリ | 333,192 KB |
実行使用メモリ | 32,964 KB |
最終ジャッジ日時 | 2024-10-26 03:43:45 |
合計ジャッジ時間 | 21,256 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 46 |
ソースコード
#include<bits/stdc++.h>#include<atcoder/all>#include <ext/pb_ds/assoc_container.hpp>#include <ext/pb_ds/tree_policy.hpp>using namespace std;using namespace atcoder;using namespace __gnu_pbds;using mint = modint998244353;#define Yes(n) cout << ((n) ? "Yes" : "No" ) << endl#define print(var) std::cout<<#var<<"="<<(var)<<std::endl#define all(a) (a).begin(), (a).end()#define vi vector<int>#define vvi vector<vi>#define vvvi vector<vvi>#define ll long long#define vll vector<ll>#define vvll vector<vll>#define vvvll vector<vvll>#define vvvvll vector<vvvll>#define vmi vector<mint>#define vvmi vector<vmi>#define vvvmi vector<vvmi>#define vvvvmi vector<vvvmi>#define vvvvvmi vector<vvvvmi>#define vs vector<string>#define pii pair<int,int>#define vpii vector<pii>#define vvpii vector<vpii>#define bit(x,i)(((x)>>(i))&1)#define inf (1<<30)#define INF (1ll<<60)#define X first#define Y secondtemplate<typename T> inline bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); }template<typename T> inline bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); }template<class T, class F> T nibutan(T ok, T ng, const F &f){while(abs(ok-ng)>1){T mid = (ok+ng)/2;(f(mid)?ok:ng) = mid;}return ok;}template<class T> vector<T> digit(T x){vector<T> res; while(x>0){res.push_back(x%10); x/=10;} return res;}ostream& operator<<(ostream& os, const mint& x){ os << x.val(); return os; }template<class T> istream &operator>>(istream &is, vector<T> &vec){ for(auto &v:vec) is >> v; return is; }template<class T> void coutvector(vector<T> x){ for(int i=0;i<(int)x.size();i++){if(i>0) cout<<" ";cout<<x[i];}cout<<endl;}using Set = tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>;template<class S, class T> using Unordered_Map = gp_hash_table<S,T>;#ifdef LOCAL#include<dump.hpp>CPP_DUMP_DEFINE_EXPORT_OBJECT(mint,val());#else#define cpp_dump#endifint main(){cin.tie(nullptr);ios::sync_with_stdio(false);int n; cin>>n;vll a(n); cin>>a;vvi g(n);for(int i=0;i<n-1;i++){int u,v; cin>>u>>v,u--,v--;g[u].push_back(v);g[v].push_back(u);}mint ans = 0;vmi dp(n,0);auto dfs = [&](auto dfs, int tp, int pa)->void{mint tmp = 0;mint sum = 0;for(auto np:g[tp])if(np!=pa){dfs(dfs,np,tp);dp[tp] += dp[np]+a[np];tmp += (dp[np]+a[np])*(dp[np]+a[np]);sum += dp[np]+a[np];}tmp = (sum*sum-tmp)/2;tmp *= a[tp];ans += tmp;dp[tp]*=a[tp];ans += dp[tp];return;};dfs(dfs,0,-1);cpp_dump(dp);cout << ans.val() << endl;}