Submission #1275304

#TimeUsernameProblemLanguageResultExecution timeMemory
1275304diep38Trains (BOI24_trains)C++20
100 / 100
117 ms9232 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ed "\n" #define fi first #define se second #define db double #define irs insert #define pb push_back #define mpa make_pair #define pi pair<int,int> #define MASK(i) (1LL << (i)) #define BIT(x, i) ((x>>i)&1) #define ON(x, i) ((x) MASK(i)) #define OFF(x, i) ((x) & ~MASK(i)) #define ALL(v) v.begin() , v.end() #define bp(x) __builtin_popcount(x) #define pii pair<int,pair<int,int>> #define fl(i,a,b) for(int i=a;i>=b;--i) #define fis(i,a,b) for(int i=a;i<=b;++i) #define Radian(x) (x * acos(-1.0) / 180) const double eps = 1e-9; const int mod=1e9+7; const int Mdem=998244353; const int LOG=19; const int base=31; const int maxn=2e5+5; const int bl = 320; #define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define gay(a) freopen(a".inp","r",stdin),freopen(a".out","w",stdout) template <class T> bool minimize(T &a, const T &b) { if(a > b) {a = b; return 1;} return 0; } template <class T> bool maximize(T &a, const T &b) { if(a < b) {a = b; return 1;} return 0; } template <class T> void compress(vector <T> &v) { sort(ALL(v)); v.erase(unique(ALL(v)), (v).end()); } void add(int &a, int b) { a += b; if (a >= mod) a -= mod; } void sub(int &a, int b) { a -= b; if (a < 0) a += mod; } struct Fenwick{ int n; vector<int> tree; Fenwick(int _n = 0){ n = _n; tree.resize(n + 1); } void update(int x, int val){ if(val == -1) val = tree[x]; for(; x <= n; x += x & -x) add(tree[x], val); } int get(int x){ int res = 0; for(; x; x -= x & -x) add(res, tree[x]); return res; } int query(int l, int r){ if(l == 0) return get(r); if(r == 0) return 0; else{ int x = get(r); sub(x, get(l - 1)); return x; } } }; int n, dp[maxn], d[maxn], x[maxn]; int sum[325][maxn]; int block = 320; vector<int> Del[maxn]; signed main(){ fast; cin >> n; // Fenwick f = Fenwick(n); fis(i, 1, n) cin >> d[i] >> x[i]; dp[1] = 1; fis(i, 1, n){ for(int j : Del[i]) sub(sum[d[j]][j % d[j]], dp[j]); fis(j, 1, block) add(dp[i], sum[j][i % j]); if(d[i] > block){ for(int v = 1; v <= x[i] && i + v * d[i] <= n; ++v){ add(dp[i + v * d[i]], dp[i]); } } else{ if(d[i] == 0) continue; add(sum[d[i]][i % d[i]], dp[i]); if(i + d[i] * (x[i] + 1) <= n) Del[i + d[i] * (x[i] + 1)].pb(i); } } int ans = 0; fis(i, 1, n) add(ans, dp[i]); cout << ans << ed; // [i + d[i], i + d[i] * x[i]] 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...