Submission #1149128

#TimeUsernameProblemLanguageResultExecution timeMemory
1149128boboTrains (BOI24_trains)C++20
58 / 100
1981 ms265224 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

#define int long long
#define all(x) x.begin(), x.end()

const int mod = 1000000007;
const int S = 330;
const int N = 1e5 + 5;

int n, d[N], x[N], dp[N], de[N], ans = 0;
vector<int> rm[N];
int lz[N][S];

int32_t main() {
    ios::sync_with_stdio(0); 
    cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> d[i] >> x[i];
        if (d[i] == 0 || d[i] > n) continue;
        int dest = i;
        for (int j = i; j <= min(n, i + x[i] * d[i]); j += d[i]) dest = j;
        rm[dest].push_back(i);
        de[i] = dest;
    }
    dp[1] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < S; j++) dp[i] = (dp[i] + lz[i][j]) % mod;
        for (int train : rm[i]) if (d[train] < S) lz[i][d[train]] = (lz[i][d[train]] - dp[train] + mod) % mod;
        if (d[i] >= S) {
            for (int j = i + d[i]; j <= de[i]; j += d[i]) dp[j] = (dp[j] + dp[i]) % mod;
        } else {
            lz[i][d[i]] = (lz[i][d[i]] + dp[i]) % mod;
            for (int j = 0; j < S; j++) if (i + j <= n) lz[i + j][j] = (lz[i + j][j] + lz[i][j]) % mod;
        }
        ans = (ans + dp[i]) % mod;
    }
    cout << ans << '\n';
}
#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...