Submission #1051393

#TimeUsernameProblemLanguageResultExecution timeMemory
1051393deeraTrains (BOI24_trains)C++14
0 / 100
71 ms85580 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const ll MOD = 1e9+7;

int main() {
    ll n; cin >> n;
    ll m = n + 100;
    
    const ll p = (ll)sqrt(n);

    vector<ll> dp(m);
    vector<ll> d(m), x(m);
    vector<vector<ll>> rest(m, vector<ll>(p, 0));

    for (ll i = 1; i <= n; i++) cin >> d[i] >> x[i];
    for (ll i = 0; i < dp.size(); i++) dp[i] = 1;

    for (ll i = n; i >= 1; i--) {
        if (d[i] == 0) continue; // it's broken

        ll step = d[i];
        ll next = i + step;
        ll maxd = i + step * (x[i] + 1);

        
        if (step >= p) {
            for (ll j = next; j <= n && j <= maxd; j+=step) {
                dp[i] = (dp[j] + dp[i]) % MOD;
            }
        } else {
            if (next <= n) dp[i] += rest[next][step];
            if (maxd <= n) dp[i] -= rest[maxd][step];
        }

        for (int step = 1; step < p; step++) {
            ll next = i + step;

            if (next > n) continue; 
            rest[i][step] = (dp[i] + rest[i][step] + rest[next][step]) % MOD;
        }
    }

    cout << dp[1] % MOD << endl;
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:19:22: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for (ll i = 0; i < dp.size(); i++) dp[i] = 1;
      |                    ~~^~~~~~~~~~~
#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...