#include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; vector> G[100010]; int c[100010],comp[100010],par[100010],par_id[100010],d[100010]; void dfs(int s,int p,int col,int x){ c[s] = col; comp[s] = x; par[s] = p; for(auto [v,id]:G[s]){ if(c[v]!=-1) continue; par[v] = id; d[v] = d[s] + 1; dfs(v,s,1 - col,x); } } mint a[100010],b[100010],ans[100010]; bool vis[100010]; void solve_dfs(int s,int p,int id){ if(vis[s]) return; vis[s] = true; cerr << " s == " << s << "\n"; for(auto [v,id]:G[s]){ if(vis[v]) continue; solve_dfs(v,s,id); } if(p!=-1 && id!=-1){ mint c = b[s] - a[s]; a[s] += c; a[p] += c; ans[id] = c; cerr << " deb " << s << " " << p << " " << c.val() << "\n"; } } #include #include // (頂点,辺) pair,vector> get_path(int from,int to){ assert(from!=to); int a = from,b = to; vector v1,v2,e1,e2; v1.push_back(a); v2.push_back(b); while(a!=b){ if(d[a]>d[b]){ v1.push_back(par[a]); e1.push_back(par_id[a]); a = par[a]; }else{ v2.push_back(par[b]); e2.push_back(par_id[b]); b = par[b]; } } reverse(v2.begin(),v2.end()); reverse(e2.begin(),e2.end()); // lcaが被る v1.pop_back(); v1.insert(v1.end(),v2.begin(),v2.end()); e1.insert(e1.end(),e2.begin(),e2.end()); return {v1,e1}; } #include int main(){ int i,n,m; cin >> n >> m; for(i=0;i> x; b[i] = x; } for(i=0;i> u >> v; u--; v--; G[u].push_back({v,i}); G[v].push_back({u,i}); } for(i=0;i> cc(n); for(i=0;i s; for(int v:ver) s.insert(v); for(int v:ver){ for(auto [u,id]:G[v]){ if(s.count(u)) continue; s.insert(u); cerr << u << " solve_dfs " << v << "\n"; solve_dfs(u,v,id); } } cerr << "DEBUG\n"; for(int x:ver) cerr << x << " "; cerr << "\n"; for(int id=0;id yのパスに沿って塗る // solve_dfsとは違う順番じゃないとダメ (verの順になる) while(ver.size()){ int z = ver.back(); ver.pop_back(); if(ver.size()){ mint c = b[z] - a[z]; ans[ed.back()] = c; a[z] += c; a[ver.back()] += c; } ed.pop_back(); } } } bool ok = true; for(i=0;i