Submission #1130578

#TimeUsernameProblemLanguageResultExecution timeMemory
1130578kirakosyanTrains (BOI24_trains)C++20
0 / 100
1049 ms1114112 KiB
#include<iostream> #include<vector> #include<algorithm> #include<cmath> #include<queue> #include<map> using namespace std; using ll = long long; ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } ll mod = 1e9 + 7; vector<ll> seg; void update(ll l, ll r, ll lx, ll rx, ll u, ll x) { if (lx >= l && rx <= r) { seg[u] += x; seg[u] %= mod; return; } if (lx > r || rx < l) return; ll m = (lx + rx) / 2; update(l, r, lx, m, 2 * u + 1, x); update(l, r, m + 1, rx, 2 * u + 2, x); } long long get(ll l, ll r, ll u, ll i) { if (l == r) return (seg[u] % mod); ll m = (l + r) / 2; if (i <= m) return (seg[u] + get(l, m, 2 * u + 1, i)) % mod; else return (seg[u] + get(m + 1, r, 2 * u + 2, i)) % mod; } void solve() { ll n; cin >> n; vector<vector<ll>>gp(n); vector<ll>d(n),x(n); ll f = 0; for (ll i = 0; i < n; i++) { cin >> d[i] >> x[i]; if (d[i] != 1)f = 1; if (d[i] == 0)continue; for (ll j = 1; j <= x[i]; j++) { if (i + j * d[i] < n) { gp[i].push_back(i + j * d[i]); } else break; } } if (f == 0) { ll ans = 0; ll s = 1; while (s < n)s <<= 1ll; seg = vector<ll>(2 * s - 1); update(0, 0, 0, s - 1, 0, 1); for (ll i = 0; i < n; i++) { ll nger = get(0, s - 1, 0, 0) % mod; ans += nger; ans %= mod; update(i + 1, min(n - 1, i + x[i]) , 0, s - 1, 0, nger); } cout << ans << endl; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); //signed _; cin >> _; while (_--) 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...