Submission #1148355

#TimeUsernameProblemLanguageResultExecution timeMemory
1148355boboTrains (BOI24_trains)C++20
0 / 100
33 ms13512 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;

int32_t main() {
    ios::sync_with_stdio(0); 
    cin.tie(0);
    int n;
    cin >> n;
    map<pair<int, int>, set<pair<int, int>>> mp;
    vector<int> d(n+1), x(n+1);
    for (int i = 1; i <= n; i++) {
        cin >> d[i] >> x[i];
        if (d[i] == 0 || d[i] > n) continue;
        int dest = i + x[i] * d[i];
        if (dest > n) dest = n - (n % d[i]);
        mp[{d[i], i % d[i]}].insert({i, dest});
    }
    vector<int> adj[n+1];
    for (auto& [pr, st] : mp) {
        auto [gap, md] = pr;
        vector<int> diff(n/gap + 5, 0);
        auto conv = [&] (int x) {
            return (x - md) / gap + 1;  
        };
        auto rec = [&] (int x) {
            return (x - 1) * gap + md;
        };
        for (auto& [start, dest] : st) {
            diff[conv(start)]++;
            diff[conv(dest) + 1]--;
        }
        for (int i = 2; i <= n / gap + 3; i++) {
            diff[i] += diff[i-1];
            if (diff[i]) {
                int cur = rec(i);
                adj[cur].push_back(cur - gap);
            }
        }
    }
    vector<int> dp(n+1, 0);
    dp[1] = 1;
    int ans = 1;
    for (int i = 2; i <= n; i++) {
        for (auto& prv : adj[i]) dp[i] = dp[i] + dp[prv] % 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...