Submission #1033326

#TimeUsernameProblemLanguageResultExecution timeMemory
1033326borisAngelovTrains (BOI24_trains)C++17
100 / 100
97 ms7148 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 100005; const int BLOCK_SIZE = 355; const int mod = 1e9 + 7; int n; int d[maxn], x[maxn]; int dp[maxn]; int pref[maxn]; int prefSmall[BLOCK_SIZE][BLOCK_SIZE]; vector<tuple<int, int, int>> toRemove[maxn]; void fastIO() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); } int main() { fastIO(); cin >> n; for (int i = 1; i <= n; ++i) { cin >> d[i] >> x[i]; } int big = sqrt(n); int ans = 0; for (int i = 1; i <= n; ++i) { for (auto [small, rem, value] : toRemove[i]) { prefSmall[small][rem] -= value; if (prefSmall[small][rem] < 0) prefSmall[small][rem] += mod; } if (i == 1) { dp[i] = 1; } else { for (int small = 1; small < big; ++small) { dp[i] += prefSmall[small][i % small]; if (dp[i] >= mod) dp[i] -= mod; } } if (d[i] >= big && d[i] != 0) { for (int j = i + d[i]; j <= n && x[i] > 0; j += d[i]) { --x[i]; dp[j] += dp[i]; if (dp[j] >= mod) dp[j] -= mod; } } else if (d[i] != 0) { prefSmall[d[i]][i % d[i]] += dp[i]; if (prefSmall[d[i]][i % d[i]] >= mod) prefSmall[d[i]][i % d[i]] -= mod; toRemove[min(1LL * n + 1LL, i + (1LL * x[i]) * (1LL * d[i]) + 1LL)].push_back({d[i], i % d[i], dp[i]}); } ans += dp[i]; if (ans >= mod) ans -= mod; //cout << i << " :: " << dp[i] << endl; } cout << ans << endl; return 0; } /* 5 1 3 1 1 0 4 1 2 1 2 5 1 3 1 1 1 2 1 2 1 2 2 :: 1 3 :: 2 4 :: 3 5 :: 5 12 3 1000000000 5 1000000000 2 1000000000 7 1000000000 4 1000000000 1 1000000000 1 1000000000 5 1000000000 2 1000000000 1 1000000000 1 1000000000 3 1000000000 here 2 :: 0 here 3 :: 0 here 4 :: 1 here 5 :: 0 here 6 :: 0 here 7 :: 1 here 8 :: 1 here 9 :: 1 here 10 :: 2 here 11 :: 5 here 12 :: 8 */
#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...