結果
問題 | No.3104 Simple Graph Problem |
ユーザー |
![]() |
提出日時 | 2025-04-20 19:08:46 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,333 bytes |
コンパイル時間 | 1,364 ms |
コンパイル使用メモリ | 99,612 KB |
実行使用メモリ | 28,008 KB |
最終ジャッジ日時 | 2025-04-20 19:09:40 |
合計ジャッジ時間 | 52,621 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 WA * 1 |
other | AC * 46 WA * 13 TLE * 6 |
ソースコード
#include <iostream> #include <atcoder/modint> #include <vector> using namespace std; using namespace atcoder; using mint = modint998244353; vector<pair<int,int>> 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 <cassert> #include <algorithm> // (頂点,辺) pair<vector<int>,vector<int>> get_path(int from,int to){ assert(from!=to); int a = from,b = to; vector<int> 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 <set> int main(){ int i,n,m; cin >> n >> m; for(i=0;i<n;i++){ int x; cin >> x; b[i] = x; } for(i=0;i<m;i++){ int u,v; cin >> u >> v; u--; v--; G[u].push_back({v,i}); G[v].push_back({u,i}); } for(i=0;i<n;i++) c[i] = -1; for(i=0;i<n;i++){ if(c[i]==-1) dfs(i,-1,0,i); } vector<vector<int>> cc(n); for(i=0;i<n;i++){ cc[comp[i]].push_back(i); } bool f = true; for(i=0;i<n;i++){ bool is_bip = true; int x = -1,y = -1,e = -1; for(int v:cc[i]){ for(auto [u,id]:G[v]){ if(c[v]==c[u]){ is_bip = false; x = v; y = u; e = id; } } } if(is_bip){ solve_dfs(i,-1,-1); }else{ auto [ver,ed] = get_path(x,y); set<int> 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<n;id++) cerr << (b[id] - a[id]).val() << " "; cerr << "\n"; mint val = b[x] - a[x] + b[y] - a[y]; for(int id=1;id<(int)ver.size() - 1;id++){ if(id&1){ val -= b[ver[id]] - a[ver[id]]; }else{ val += b[ver[id]] - a[ver[id]]; } } cerr << "val == " << val.val() << "\n"; ans[e] = val/2; a[x] += val/2; a[y] += val/2; for(int u:ver) cerr << (b[u] - a[u]).val() << " "; cerr << "\n"; // x -> 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<n;i++){ if(a[i]!=b[i]) ok = false; } if(ok){ for(i=0;i<m;i++) cout << ans[i].val() << " "; cout << "\n"; }else{ cout << -1 << "\n"; for(i=0;i<n;i++){ cerr << a[i].val() << " "; } cerr << "\n"; } }