前提・実現したいこと
ABC222のE問題を以下のコードで解いたのですが、すべてACになりません。また、自分の実行環境とAtcoderのコードテストで動かした結果が同じサンプル入力を使っているにもかかわらず、一致しません。汚いコードで申し訳ないのですが、原因を教えていただけると幸いです。
該当のソースコード
C++
1#include <bits/stdc++.h> 2using namespace std; 3typedef long long ll; 4typedef long double ld; 5const int INF = 1e9; 6 7template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } 8template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } 9template <typename Type> inline string toString(const Type &a){ostringstream oss; oss << a; return oss.str();} 10 11int N, M, K; 12const int mod = 998244353; 13vector<int> A, C, prev_v; 14vector<vector<pair<int, int>>> G; 15vector<vector<ll>> dp; 16 17// first... target, second... edge id 18void dfs(int v, int goal){ 19 if(v == goal) return; 20 for(pair<int, int> nv : G[v]){ 21 if(prev_v[nv.first] == -1 || prev_v[nv.first] != INF || nv.first == prev_v[v]) continue; 22 prev_v[nv.first] = v; 23 dfs(nv.first, goal); 24 } 25} 26 27int main(){ 28 ios::sync_with_stdio(false); 29 cin.tie(0); 30 cin >> N >> M >> K; 31 A.resize(M); 32 G.resize(N); 33 for(int i = 0; i < M; ++i){ 34 cin >> A[i]; 35 A[i]--; 36 } 37 for(int i = 0; i < N - 1; ++i){ 38 int a, b; 39 cin >> a >> b; 40 a--; b--; 41 G[a].push_back(make_pair(b, i)); G[b].push_back(make_pair(a, i)); 42 } 43 44 45 C.assign(N - 1, 0); 46 for(int i = 0; i < M - 1; ++i){ 47 prev_v.assign(N, INF); 48 prev_v[A[i]] = -1; 49 dfs(A[i], A[i + 1]); 50 int cur = A[i + 1]; 51 while(cur != A[i]){ 52 int edge_id = G[cur][prev_v[cur]].second; 53 cout << "cur = " << cur << " edge id = " << edge_id << '\n'; 54 C[edge_id]++; 55 cur = prev_v[cur]; 56 57 } 58 } 59 ll sumC = 0; 60 for(int i = 0; i < N - 1; ++i) sumC += C[i]; 61 if((K + sumC) % 2 == 1 || K + sumC < 0){ 62 cout << 0 << endl; 63 return 0; 64 } 65 dp.assign(N, vector<ll>((K + sumC) / 2 + 1 , 0)); 66 dp[0][0] = 1; 67 for(int i = 0; i < N - 1; ++i){ 68 for(int j = 0; j <= (K + sumC) / 2; ++j){ 69 if(C[i] <= j){ 70 dp[i + 1][j] += dp[i][j - C[i]]; 71 dp[i + 1][j] %= mod; 72 } 73 dp[i + 1][j] += dp[i][j]; 74 dp[i + 1][j] %= mod; 75 } 76 } 77 78 cout << dp[N - 1][(K + sumC) / 2] << endl; 79}
試したこと
- 入力サンプル1を試した結果、自分の環境では2になるが、atcoderのコードテストでは0になる
- 配列prevには正しい答えが入力されている(以下入力サンプル3を試した場合)
prev_v = -1 0 1 2 3 4 5 6 7 8
しかしedge_idの値に誤りがあると思われる。実行結果はこのようになったが、
cur = 9 edge id = 3
cur = 8 edge id = 0
cur = 7 edge id = 0
cur = 6 edge id = 8
cur = 5 edge id = 6
cur = 4 edge id = 5
cur = 3 edge id = 3
cur = 2 edge id = 2
cur = 1 edge id = 0
このサンプルケースではどの辺も一回ずつしか通らないはず。これによって、このあとのdpで使う配列Cを正しく作ることができない。
補足情報(FW/ツールのバージョンなど)
使用しているコンパイラ...gcc12.0.5
回答1件
あなたの回答
tips
プレビュー