Salvens

C

Aug 3rd, 2023
862
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  4. #include <array>
  5. #include <set>
  6.  
  7. using namespace std;
  8.  
  9. #define int long long
  10.  
  11. const long long INF = 1e18 + 7;
  12. const int MAXN = 1e5 + 100;
  13. const int N = 1e5 + 10;
  14. const int MOD = 1e9 + 7;
  15.  
  16. int dp[MAXN][3];
  17. array<int, MAXN> color, used;
  18. vector<vector<int>> g;
  19.  
  20. void dfs(int v, int p) {
  21.     used[v] = true;
  22.     array<int, 3> mx = {1, 1, 1};
  23.     for (auto to: g[v]) {
  24.         if (!used[to]) {
  25.             dfs(to, v);
  26.         }
  27.         if (to != p) {
  28.             mx[0] *= (dp[to][1] + dp[to][2]) % MOD;
  29.             mx[0] %= MOD;
  30.  
  31.             mx[1] *= (dp[to][0] + dp[to][2]) % MOD;
  32.             mx[1] %= MOD;
  33.  
  34.             mx[2] *= (dp[to][0] + dp[to][1]) % MOD;
  35.             mx[2] %= MOD;
  36.         }
  37.     }
  38.     if (color[v] != -1) {
  39.         dp[v][color[v]] = mx[color[v]];
  40.     } else {
  41.         dp[v][0] = mx[0];
  42.         dp[v][1] = mx[1];
  43.         dp[v][2] = mx[2];
  44.     }
  45. }
  46.  
  47. signed main() {
  48.     ios_base::sync_with_stdio(false);
  49.     cin.tie(nullptr);
  50.     cout.tie(nullptr);
  51.     freopen("barnpainting.in", "r", stdin);
  52.     freopen("barnpainting.out", "w", stdout);
  53.     int n, k;
  54.     cin >> n >> k;
  55.     g.resize(n);
  56.     for (int i = 0; i < n - 1; ++i) {
  57.         int u, v;
  58.         cin >> u >> v;
  59.         --u, --v;
  60.         g[u].emplace_back(v);
  61.         g[v].emplace_back(u);
  62.     }
  63.     color.fill(-1);
  64.     for (int i = 0; i < k; ++i) {
  65.         int v, col;
  66.         cin >> v >> col;
  67.         --v, --col;
  68.         color[v] = col;
  69.     }
  70.     dfs(0, -1);
  71.     cout << ((dp[0][0] + dp[0][1]) % MOD + dp[0][2]) % MOD << '\n';
  72. }
Advertisement
Add Comment
Please, Sign In to add comment