Submission #1125957

#TimeUsernameProblemLanguageResultExecution timeMemory
1125957quanquaiTrains (BOI24_trains)C++20
100 / 100
336 ms164580 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  
  int n; cin >> n;
  vector<pair<int, int>> a(n + 1);
  for (int i = 1; i <= n; i++) {
    cin >> a[i].first >> a[i].second;
  }
  int block_size = 200;
  const int mod = (int) 1e9 + 7;
  vector<int64_t> dp(n + 1, 0);
  vector<vector<int64_t>> diff(block_size + 5, vector<int64_t> (n + 1, 0));
  dp[1] = 1;
  int64_t ans = 0;
  for (int i = 1; i <= n; i++) {
    int d = a[i].first, step = a[i].second;
    int64_t ways = dp[i];
    for (int j = 1; j <= block_size; j++) {
      if (i - j >= 0) diff[j][i] += diff[j][i - j];
      diff[j][i] %= mod;
      ways += diff[j][i];
      ways %= mod;
    }
    ans += ways;
    ans %= mod;
    if (d == 0 || step == 0) continue;
    if (d >= block_size) {
      for (int cur = i + d, j = 1; (cur <= n && j <= step); j++, cur += d) {
        if (cur <= n) dp[cur] += ways, dp[cur] %= mod;  
      }
    } else {
      if (i + d <= n && step > 0) {
        diff[d][i + d] += ways;
        diff[d][i + d] %= mod;
        int last = i + (step + 1) * d;
        if (last <= n) {
          diff[d][last] -= ways;
          diff[d][last] %= mod;
          diff[d][last] += mod;
          diff[d][last] %= mod;
        }
      } 
    }
  }
  cout << ans << '\n';
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...