Submission #1145411

#TimeUsernameProblemLanguageResultExecution timeMemory
1145411Rawlat_vanakTrains (BOI24_trains)C++20
0 / 100
479 ms788312 KiB
#include <bits/stdc++.h> using namespace std; //#define int long long #define speedIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define mod 1000000007 #define f first #define s second #define pii pair<int,int> #define pb push_back vector<vector<int>> partdp; vector<vector<vector<int>>> bit;//step,start,value const int block=50; void update(int idx, int val, int step, int start){ while(idx<=bit[step][start].size()){ bit[step][start][idx]=(bit[step][start][idx]+val)%mod; idx+=idx&(-idx); } } int get(int idx, int step, int start){ int ans=0; while(idx>0){ ans=(ans+bit[step][start][idx])%mod; idx-=(idx)&(-idx); } return ans; } int32_t main(){ speedIO; int t,n,m,k,q; //cin>>t; t=1; while(t--){ cin>>n; vector<int> d(n+1),x(n+1),dp(n+1,0); partdp.resize(block,vector<int>(n+1)); bit.resize(block,vector<vector<int>>(block,vector<int>(n+5,0))); for(int i=1;i<=n;i++){ cin>>d[i]>>x[i]; } dp[1]=1; //update(1,1,1); for(int i=1;i<=n;i++){ for(int j=1;j<=block-1;j++){ int start=i%j; if(start==0){ start=j; } int tmp=i-start; tmp/=j; tmp+=1; //if(j<6) cout<<"hi "<<i<<' '<<tmp<<' '<<j<<' '<<start<<'\n'; //if(j<6) cout<<"what "<<get(tmp,j,start)<<'\n'; dp[i]=(dp[i]+get(tmp,j,start))%mod; } if(d[i]==0) continue; if(d[i]>=block){ long long int wow=x[i]*d[i]; int wew=wow; if(i+wow>n){ int wew=n-i; } for(int j=i+d[i];j<=min(i+wew,n);j+=d[i]){ dp[j]=(dp[j]+dp[i])%mod; } }else{ int start=i%d[i]; if(start==0){ start=d[i]; } int l=i+d[i]; long long int wow=x[i]*d[i]; int wew=wow; if(i+wow>n){ int wew=n-i; } int r=min(i+wew,n); //cout<<l<<' '<<r<<'\n'; if(l>r) continue; int tmp=l-start; tmp/=d[i]; tmp+=1; //cout<<tmp<<' '<<dp[i]<<' '<<d[i]<<' '<<start<<'\n'; update(tmp,dp[i],d[i],start); if(r==n){ //update(n,-dp[i],d[i],start); }else{ tmp=r-start; tmp/=d[i]; tmp+=2; //cout<<tmp<<' '<<-dp[i]<<' '<<d[i]<<' '<<start<<'\n'; update(tmp,-dp[i],d[i],start); } } } /*cout<<'\n'; for(int i=0;i<=n+3;i++){ cout<<bit[1][1][i]<<' '; } cout<<'\n'; cout<<get(5,1,1)<<'\n';*/ int final=0; for(int i=1;i<=n;i++){ final=(final+dp[i])%mod; //cout<<dp[i]<<' '; } cout<<final<<'\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...