Dang_Quan_10_Tin

GRAPH (VOI 2022)

Mar 5th, 2022 (edited)
949
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #define task "GRAPH"
  2. #include <iostream>
  3. #include <cstdio>
  4.  
  5. using namespace std;
  6.  
  7. using ll = long long;
  8. using ld = long double;
  9.  
  10. constexpr int N = 2e3 + 5;
  11. constexpr int mod = 1e9 + 7;
  12. int a[N], n, b;
  13. int dp[N][N], g[N][N];
  14.  
  15. void Read()
  16. {
  17.     cin >> n >> b;
  18.  
  19.     for (int i = 1; i <= n; ++i)
  20.         cin >> a[i];
  21. }
  22.  
  23. void Sub_3()
  24. {
  25.     dp[n + 1][0] = 1;
  26.  
  27.     for (int i = n; i; --i)
  28.         for (int j = 0; j <= n - i + 1; ++j)
  29.         {
  30.             if (a[i] == -1)
  31.             {
  32.                 for (int t = 0; t <= i - 1; ++t)
  33.                     if (j >= (t > 0) && t + j - (t > 0) <= b)
  34.                         (dp[i][j] += dp[i + 1][j - (t > 0)]) %= mod;
  35.             }
  36.             else
  37.             {
  38.                 if (j >= (a[i] > 0) && a[i] + j - (a[i] > 0) <= b)
  39.                     (dp[i][j] += dp[i + 1][j - (a[i] > 0)]) %= mod;
  40.             }
  41.  
  42.             g[i][j] = ((j == 0 ? 0 : g[i][j - 1]) + dp[i][j]) % mod;
  43.         }
  44.  
  45.     int ans(0);
  46.  
  47.     for (int i = 0; i <= n; ++i)
  48.         (ans += dp[1][i]) %= mod;
  49.  
  50.     cout << (ans + mod) % mod;
  51. }
  52.  
  53. void Solve()
  54. {
  55.     dp[n + 1][0] = 1;
  56.  
  57.     for (int i = n; i; --i)
  58.     {
  59.         for (int j = 0; j <= n - i + 1 && j <= b; ++j)
  60.         {
  61.             if (a[i] == -1)
  62.             {
  63.                 int t = min(i - 1, b);
  64.  
  65.                 if (j == 0)
  66.                     t = min(t, 0);
  67.                 else if (j == b)
  68.                     t = min(t, 1);
  69.                 else
  70.                     t = min(t, b - j + 1);
  71.  
  72.                 //for (int t = 0; t <= i - 1 && j >= (t > 0) && t + j - (t > 0) <= b; ++t)
  73.                 //    (dp[i][j] += dp[i + 1][j - (t > 0)]) %= mod;
  74.  
  75.                 dp[i][j] = (dp[i + 1][j] + 1ll * dp[i + 1][j - 1] * t % mod) % mod;
  76.             }
  77.             else
  78.             {
  79.                 if (j >= (a[i] > 0) && a[i] + j - (a[i] > 0) <= b)
  80.                     (dp[i][j] += dp[i + 1][j - (a[i] > 0)]) %= mod;
  81.             }
  82.         }
  83.  
  84.         for (int j = 0; j <= n; ++j)
  85.             g[i][j] = ((j == 0 ? 0 : g[i][j - 1]) + dp[i][j]) % mod;
  86.     }
  87.  
  88.     int ans(0);
  89.  
  90.     for (int i = 0; i <= n; ++i)
  91.         (ans += dp[1][i]) %= mod;
  92.  
  93.     cout << (ans + mod) % mod;
  94. }
  95.  
  96. int32_t main()
  97. {
  98.     ios_base::sync_with_stdio(0);
  99.     cin.tie(0);
  100.     cout.tie(0);
  101.  
  102.     if (fopen(task ".INP", "r"))
  103.     {
  104.         freopen(task ".INP", "r", stdin);
  105.         freopen(task ".OUT", "w", stdout);
  106.     }
  107.  
  108.     Read();
  109.     Solve();
  110. }
  111.  
Add Comment
Please, Sign In to add comment