Problem p03278 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
typedef long long int ll;
typedef long double ld;
#define pb push_back
#define pii pair<int, int>
#define F first
#define S second
#define endl '\n'
// #define int long long
#define sync                                                                   \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);                                                                  \
  cout.tie(0)
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#define kill(x) return cout << x << '\n', 0;
using namespace std;
const int N = 5e3 + 100;
ll mod = 1e9 + 7;
deque<int> dp[N];
vector<int> g[N];
void mrg(ll v, ll u) {
  deque<int> pd;
  for (int i = 0; i < dp[u].size() + dp[v].size() + 10; i++)
    pd.pb(0);
  for (int i = 0; i < dp[v].size(); i++) {
    for (int j = 0; j < dp[u].size(); j++) {
      pd[i + j] += (ll)dp[u][j] * (ll)dp[v][i] % mod;
      pd[i + j] %= mod;
      /// mod
    }
  }
  dp[v] = pd;
}
ll fac[N];
void dfs(ll v, ll p) {
  vector<int> b;
  for (auto u : g[v]) {
    if (u == p)
      continue;
    dfs(u, v);
    b.pb(u);
    dp[u].push_front(0);
    for (int i = 2; i < dp[u].size(); i += 2) {
      dp[u][0] += (ll)-dp[u][i] * fac[i - 1] % mod;
      dp[u][0] += mod;
      dp[u][0] %= mod;
      /// mod
    }
  }
  if (!b.size()) {
    dp[v].pb(1);
    return;
  }
  dp[v] = dp[b[0]];
  for (int i = 1; i < b.size(); i++) {
    mrg(v, b[i]);
  }
}
int32_t main() {
  sync;
  ll n;
  cin >> n;
  fac[1] = 1;
  for (int i = 3; i < N; i++) {
    fac[i] = fac[i - 2] * (ll)i % mod;
  }
  for (int i = 0; i < n - 1; i++) {
    ll u, v;
    cin >> u >> v;
    g[u].pb(v);
    g[v].pb(u);
  }
  dfs(1, 1);
  ll ans = 0;
  for (int i = 1; i < dp[1].size(); i += 2) {
    ans += (ll)dp[1][i] * fac[i] % mod;
  }
  cout << ans % mod << endl;
}


Fixed submission:
#include <bits/stdc++.h>
typedef long long int ll;
typedef long double ld;
#define pb push_back
#define pii pair<int, int>
#define F first
#define S second
#define endl '\n'
// #define int long long
#define sync                                                                   \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);                                                                  \
  cout.tie(0)
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#define kill(x) return cout << x << '\n', 0;
using namespace std;
const int N = 5e3 + 100;
ll mod = 1e9 + 7;
deque<int> dp[N];
vector<int> g[N];
void mrg(ll v, ll u) {
  deque<int> pd;
  for (int i = 0; i < dp[u].size() + dp[v].size(); i++)
    pd.pb(0);
  for (int i = 0; i < dp[v].size(); i++) {
    for (int j = 0; j < dp[u].size(); j++) {
      pd[i + j] += (ll)dp[u][j] * (ll)dp[v][i] % mod;
      pd[i + j] %= mod;
      /// mod
    }
  }
  dp[v] = pd;
}
ll fac[N];
void dfs(ll v, ll p) {
  vector<int> b;
  for (auto u : g[v]) {
    if (u == p)
      continue;
    dfs(u, v);
    b.pb(u);
    dp[u].push_front(0);
    for (int i = 2; i < dp[u].size(); i += 2) {
      dp[u][0] += (ll)-dp[u][i] * fac[i - 1] % mod;
      dp[u][0] += mod;
      dp[u][0] %= mod;
      /// mod
    }
  }
  if (!b.size()) {
    dp[v].pb(1);
    return;
  }
  dp[v] = dp[b[0]];
  for (int i = 1; i < b.size(); i++) {
    mrg(v, b[i]);
  }
}
int32_t main() {
  sync;
  ll n;
  cin >> n;
  fac[1] = 1;
  for (int i = 3; i < N; i++) {
    fac[i] = fac[i - 2] * (ll)i % mod;
  }
  for (int i = 0; i < n - 1; i++) {
    ll u, v;
    cin >> u >> v;
    g[u].pb(v);
    g[v].pb(u);
  }
  dfs(1, 1);
  ll ans = 0;
  for (int i = 1; i < dp[1].size(); i += 2) {
    ans += (ll)dp[1][i] * fac[i] % mod;
  }
  cout << ans % mod << endl;
}