제출 #1147969

#제출 시각아이디문제언어결과실행 시간메모리
1147969tianyaochiunTrains (BOI24_trains)C++20
71 / 100
2090 ms329496 KiB
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC optimize("Ofast")
#define ll long long
#define pii pair<int,int> 
#define piii pair<pii,int>
#define F first
#define S second
#define pb push_back
#define eb emplace_back
#define endl "\n"
#define all(a) a.begin(),a.end()
//#define int long long
 
const int mod=1e9+7;
 
void solve(){
	int n,ans=0;
	cin>>n;
	int d[n],x[n];
	vector<pii> idx[n];
	map<pii,vector<int>> mp;
	for(int i=0;i<n;++i) cin>>d[i]>>x[i];
	for(int i=0;i<n;++i){
		int tmp=0;
		for(auto[m,r]:idx[i]){
			int id=i/m;
			auto &it=mp[{m,r}];
			if(id) (it[id]+=it[id-1])%=mod;
			(tmp+=it[id])%=mod;
		}
		if(!i) tmp=1;
		(ans+=tmp)%=mod;
		if(i+d[i]>=n||d[i]==0||x[i]==0) continue;
		int k=i%d[i];
		auto &it=mp[{d[i],k}];
		if(it.empty()){
			for(int j=k;j<n;j+=d[i]){
				it.pb(0);
				idx[j].eb(d[i],k);
			}
		}
		int id=i/d[i];
		(it[id+1]+=tmp)%=mod;
		if(id+x[i]+1<it.size()){
			it[id+x[i]+1]-=tmp;
			if(it[id+x[i]+1]<0) it[id+x[i]+1]+=mod;
		}
	}
	cout<<ans;
}
 
signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int t=1;
	//cin>>t;
	while(t--){
		solve();
	}
	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...