Alex_tz307

USACO 2017 December Contest, Gold Problem 2. Barn Painting

Jun 1st, 2021
848
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using int64 = long long;
  5.  
  6. ifstream fin("barnpainting.in");
  7. ofstream fout("barnpainting.out");
  8.  
  9. const int mod = 1e9 + 7;
  10. const int MAXN = 1e5;
  11. vector<int> G[MAXN];
  12. int dp[MAXN][3];
  13.  
  14. void add_self(int &x, int y) {
  15.   x += y;
  16.   if (x >= mod)
  17.     x -= mod;
  18. }
  19.  
  20. void dfs(int u, int p) {
  21.   for (int v : G[u])
  22.     if (v != p) {
  23.       dfs(v, u);
  24.       for (int c1 = 0; c1 < 3; ++c1) {
  25.         int sum = 0;
  26.         for (int c2 = 0; c2 < 3; ++c2)
  27.           if (c2 != c1)
  28.             add_self(sum, dp[v][c2]);
  29.         dp[u][c1] = (int64)dp[u][c1] * sum % mod;
  30.       }
  31.     }
  32. }
  33.  
  34. int main() {
  35.   int n, k;
  36.   fin >> n >> k;
  37.   for (int i = 1; i < n; ++i) {
  38.     int u, v;
  39.     fin >> u >> v;
  40.     --u, --v;
  41.     G[u].emplace_back(v);
  42.     G[v].emplace_back(u);
  43.   }
  44.   for (int u = 0; u < n; ++u)
  45.     for (int c = 0; c < 3; ++c)
  46.       dp[u][c] = 1;
  47.   for (int i = 0; i < k; ++i) {
  48.     int u, c;
  49.     fin >> u >> c;
  50.     --u, --c;
  51.     for (int col = 0; col < 3; ++col)
  52.       if (col != c)
  53.         dp[u][col] = 0;
  54.   }
  55.   dfs(0, -1);
  56.   int ans = 0;
  57.   for (int c = 0; c < 3; ++c)
  58.     add_self(ans, dp[0][c]);
  59.   fout << ans;
  60.   fin.close();
  61.   fout.close();
  62.   return 0;
  63. }
  64.  
Advertisement
Add Comment
Please, Sign In to add comment