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...