Submission #1033747

#TimeUsernameProblemLanguageResultExecution timeMemory
1033747TozzyyyyTrains (BOI24_trains)C++14
100 / 100
158 ms7116 KiB
#include<bits/stdc++.h>
#define all(x) (x).begin() , (x).end()
#define pll pair<long long, long long>
#define pii pair<int , int>
#define fi first
#define se second
#define bit(i,j) ((j >> i) & 1)
using namespace std;
 
const long long inf = 1e18;
const int mod = 1e9+7;
const int MAXN = 2e5+100;
 
#define int long long
 
int mp[500][500];
int32_t main(){
  	//freopen("B.inp", "r", stdin);
	//freopen("B.out", "w", stdout);
	ios_base::sync_with_stdio(0); cin.tie(0);
	int n; cin >> n;
	vector<int> d(n+1) , x(n+1);
	const int block = 320;
 
	for(int i = 1 ; i <= n ; i++) cin >> d[i] >> x[i];
 
	vector<int> dp(n+1);
	dp[1] = 1;
	priority_queue<pll , vector<pll> , greater<pll>> Q;
	if(d[1] > block){
		for(int i = 1 + d[1] ; i <= min(n , 1 + x[1] * d[1]) ; i += d[1]) dp[i] += 1;
	}else if(d[1] != 0){
		Q.push({1 + x[1] * d[1] , 1});
		mp[d[1]][1%d[1]] += 1;
	}
	int ans = 1;
	for(int i = 2 ; i <= n ; i++){
		while(Q.size()){
			pll t = Q.top();
			if(t.fi < i){
				if(d[t.se] != 0){
					mp[d[t.se]][t.se%d[t.se]] = (mp[d[t.se]][t.se%d[t.se]] - dp[t.se] + mod) % mod;
				}
				Q.pop();
			}
			else break;
		}
		for(int j = 1 ; j <= block ; j++) dp[i] = (dp[i] + mp[j][i%j]) % mod;
		ans = (ans + dp[i]) % mod;
			
		if(d[i] == 0) continue;
		if(d[i] > block){
			for(int j = i + d[i] ; j <= min(n , i + x[i] * d[i]) ; j += d[i]) dp[j] = (dp[j] + dp[i]) % mod;
		}else{
			Q.push({i + x[i] * d[i] , i});
			mp[d[i]][i%d[i]] += dp[i];
			mp[d[i]][i%d[i]] %= mod;
		}
	}
	cout << ans << "\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...