40TLE 求助
查看原帖
40TLE 求助
681755
CuteGirlGC楼主2024/3/27 20:03

RT

#include <ctime>
#include <iostream>
#include <vector>

using namespace std;
using ll = long long;

const int kMaxN = 1e5 + 1, kMod = 1e9 + 7;

int clr[kMaxN];
ll n, t, dp[kMaxN][4];
vector<int> g[kMaxN];

inline void Dp(int x, int fa, int color) {
  dp[x][color] = 1;
  for (int i : g[x]) {
    if (i != fa) {
      ll sum = 0;
      if (clr[i]) {
        if (clr[i] != color) {
          Dp(i, x, clr[i]);
          sum += dp[i][clr[i]];
        }
      } else {
        for (int j = 1; j <= 3; j++) {
          if (color != j) {
            Dp(i, x, j);
            sum += dp[i][j];
          }
        }
      }
      dp[x][color] = (dp[x][color] * sum) % kMod;
    }
  }
}

int main() {
  cin >> n >> t;
  for (int i = 1, u, v; i < n; i++) {
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int b, c; t; t--) {
    cin >> b >> c;
    clr[b] = c;
  }
  if (clr[1]) {
    Dp(1, 0, clr[1]);
  } else {
    for (int i = 1; i <= 3; i++) {
      Dp(1, 0, i);
    }
  }
  cout << ((dp[1][1] + dp[1][2]) % kMod + dp[1][3]) % kMod;
  return 0;
}
2024/3/27 20:03
加载中...