제출 #1268121

#제출 시각아이디문제언어결과실행 시간메모리
1268121nguyenkhangxTrains (BOI24_trains)C++20
16 / 100
212 ms126132 KiB
#include <bits/stdc++.h> using namespace std; using int64 = long long; const int MOD = 1000000007; int addmod(int a, int b){ a += b; if(a >= MOD) a -= MOD; return a; } int submod(int a, int b){ a -= b; if(a < 0) a += MOD; return a; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N; if(!(cin >> N)) return 0; vector<int> d(N+2), x(N+2); for(int i=1;i<=N;i++){ cin >> d[i] >> x[i]; } int B = max(1, (int)sqrt(N)); // ngưỡng // g[d] size N+ B + 5 để an toàn khi truy xuất i + k*d ngoài N vector<vector<int>> g(B+1, vector<int>(N + B + 5, 0)); vector<int> dp(N+2, 0); for(int i = N; i >= 1; --i){ if(d[i] == 0){ dp[i] = 1; } else if(d[i] <= B){ // dùng g[d] int start = i + d[i]; if(start > N){ dp[i] = 1; } else { int endPos = i + d[i] * (x[i] + 1); // vị trí sau phần tử cần trừ if(endPos > N + B) endPos = N + B + 1; // an toàn int sumSeg = submod(g[d[i]][start], (endPos <= N + B ? g[d[i]][endPos] : 0)); dp[i] = addmod(1, sumSeg); } } else { // d[i] > B, số phần tử <= N / d[i] <= N / (B+1) ~ B -> duyệt trực tiếp int64 s = 0; for(int k = 1; k <= x[i]; ++k){ int pos = i + k * d[i]; if(pos > N) break; s += dp[pos]; if(s >= MOD) s -= MOD; } dp[i] = (1 + (int)s) % MOD; } // cập nhật g for all small d for(int small = 1; small <= B; ++small){ int idx = i; int nxt = i + small; int val = dp[i]; int accum = 0; if(nxt <= N + B) accum = g[small][nxt]; g[small][idx] = addmod(val, accum); } } cout << dp[1] % MOD << "\n"; return 0; }
#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...