Submission #1207712

#TimeUsernameProblemLanguageResultExecution timeMemory
1207712dksnfjkfnwkfwTrains (BOI24_trains)C++20
24 / 100
44 ms6736 KiB
#include <bits/stdc++.h> using namespace std; #define sonic ios_base::sync_with_stdio(false);cin.tie(0); cout.tie(0) #define IO(main) if(fopen(main".inp","r")){freopen(main".inp","r",stdin);freopen(main".out","w",stdout);} #define pb push_back #define fi first #define se second #define mp make_pair #define ins insert #define pb push_back #define el cout << endl #define SZ(x) ((int)(x).size()) #define ALL(x) (x).begin(), (x).end() #define MASK(i) ((1LL)<<(i)) #define BIT(x,i) (((x)>>(i))&(1LL)) #define FOR(i, a, b) for(int (i)=(a);(i)<=(b); i++) #define FORD(i, a, b) for(int (i)=(a);(i)>=(b); i--) using ll = long long; #define int ll using ull = unsigned long long; using ld = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; using vi = vector<int>; using vii = vector<pii>; const int N = 1e6 + 9; const int mod = 1e9 + 7; const ll INF = 1e18 + 7; const int base = 31; const int LOG = 20; const ll MOD = 1e9 + 7; int mul(int x, int y) {return 1LL * x * y % mod;} int calPw(int x, int y) { int ans = 1; while(y) { if (y&1) ans = 1LL * ans * x % mod; x = 1LL * x * x % mod; y >>= 1; } return ans; } int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1}; int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1}; int dy[8] = {1, 1, 0, -1, -1, -1, 0, 1}; ///Author: Le Chi Thien Luong The Vinh high school 2008 ///code template<class X, class Y> bool minimize(X &x , Y y){ if(x > y){ x = y; return true; } return false; } template<class X, class Y> bool maximize(X &x , Y y){ if(x < y){ x = y; return true; } return false; } void add(int &x, int y){ x+=y; if(x >= mod)x-=mod; } void Solve(){ } int n, x[N], d[N], dp[N]; struct ST{ int st[4 * N + 2], lz[4 * N + 2]; void push(int id){ if(lz[id] == 0)return; add(st[id * 2], lz[id]); add(st[id * 2 + 1], lz[id]); add(lz[id * 2], lz[id]); add(lz[id * 2 + 1], lz[id]); lz[id] = 0; } void update(int u, int v, int val, int id = 1, int l =1 , int r = n){ if(v < l || r < u)return; if(l >= u && r <= v){ add(st[id], val); add(lz[id], val); return ; } push(id); int mid = l + r >> 1; update(u, v, val, id * 2, l, mid); update(u, v, val, id * 2 + 1, mid + 1, r); st[id] = max(st[id * 2], st[id * 2 + 1]); } int get(int u, int v, int id = 1, int l = 1, int r = n){ if(v < l || r < u)return -INF; if(l >= u && r <= v)return st[id]; int mid = l + r >> 1; push(id); int A = get(u, v, id * 2, l, mid); int B = get(u, v, id * 2 + 1, mid + 1, r); return max(A, B); } }it; void Read(){ cin >> n; FOR(i, 1, n){ cin >> d[i] >> x[i]; } if(n <= 1000){ dp[1] = 1; FOR(i, 1, n){ if(dp[i] > 0) for(int j = i + d[i]; j <= min(n, i + d[i] * x[i]); j += d[i]){ if(i >= j)break; add(dp[j], dp[i]); } } int Ans = 0; FOR(i, 1, n)add(Ans, dp[i]); cout << Ans;return; } it.update(1, 1, 1); FOR(i, 1, n){ dp[i] = it.get(i, i); int mx = min(n, i + d[i] * x[i]); if(i + 1 <= n) { // cout << i + 1 << " " << mx << " " << dp[i] << " " << it.get(4, 4)<< endl; if(i + 1 > mx)continue; it.update(i + 1, mx, dp[i]); /// cout << i + 1 << " " << mx << " " << dp[i] << " " << it.get(4, 4)<< endl; } } int ans = 0; FOR(i, 1, n)add(ans, it.get(i, i)); cout << ans; } signed main() { sonic; int TEST = 1; // cin >> TEST; while(TEST--) { Read(); 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...