제출 #1269151

#제출 시각아이디문제언어결과실행 시간메모리
1269151dostsTrains (BOI24_trains)C++20
100 / 100
1260 ms6608 KiB
#include <bits/stdc++.h>
#define int long long
#define vi vector<int>
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " << 
#define all(x) x.begin(),x.end()
using namespace std;


const int N = 3e5+1,inf = 2e18,MOD = 1e9+7;

int add(int x,int y) {
    if (x+y >= MOD) return x+y-MOD;
    return x+y;
}


const int B = 2;
int lazy[B+1][B]{};
void solve() {
    int n;
    cin >> n;
    vi d(n+1),x(n+1);
    for (int i=1;i<=n;i++) {
        cin >> d[i] >> x[i];
    }
    vector<pair<pii,int>> upds[n+1];
    vi dp(n+1,0);
    int ans = 0;
    for (int i=1;i<=n;i++) {
        if (i>1){
            for (auto it : upds[i]) lazy[it.ff.ff][it.ff.ss]=add(lazy[it.ff.ff][it.ff.ss],MOD-it.ss);
        }
        else dp[i] = 1;
        for (int j=1;j<=B;j++) dp[i] = add(dp[i],lazy[j][i%j]);
        ans = add(ans,dp[i]);
        if (!d[i]) continue;
        if (d[i]+i > n) continue;
        if (d[i] > B) {
            for (int j = i+d[i],ctr = 1;j<=n && ctr <= x[i];j+=d[i],ctr++) {
                dp[j] = add(dp[j],dp[i]);
            }
        }
        else {
            lazy[d[i]][i%d[i]]=add(lazy[d[i]][i%d[i]],dp[i]);
            if (i+(x[i]+1)*d[i] <= n) upds[i+(x[i]+1)*d[i]].push_back({{d[i],i%d[i]},dp[i]});
        }
    }
    cout << ans << '\n';

}

signed main() {
    ios_base::sync_with_stdio(0),cin.tie(0);
    #ifdef Dodi
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    // cin >> t;
    while (t --> 0) solve();
}
#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...