Submission #1194769

#TimeUsernameProblemLanguageResultExecution timeMemory
1194769DeathIsAweBouquet (EGOI24_bouquet)C++20
100 / 100
136 ms15688 KiB
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define ff first #define ss second #define ll long long using namespace std; int segment[524288], dp[200000]; void seginsert(int val, int pos) { pos += 262144; segment[pos] = val; pos /= 2; while (pos > 0) { segment[pos] = max(segment[pos*2 + 1], segment[pos*2]); pos /= 2; } } int segquery(int l, int r) { l += 262144; r += 262144; int val = 0; while (l <= r) { if (l % 2 == 1) {val = max(val, segment[l++]);} if (r % 2 == 0) {val = max(val, segment[r--]);} l /= 2; r /= 2; } return val; } int main() { int n; cin >> n; vector<pair<int,int>> ranges(n); for (int i=0;i<n;i++) { cin >> ranges[i].ff >> ranges[i].ss; } vector<vector<int>> ends(n + 1); for (int i=0;i<n;i++) { ends[min(ranges[i].ss + i + 1, n)].pb(i); } for (int i=0;i<524288;i++) { segment[i] = 0; } int tempdp; dp[0] = 1; for (int i=1;i<n;i++) { for (int j: ends[i]) { seginsert(dp[j], j); } dp[i] = 1 + segquery(0, i - ranges[i].ff - 1); } int ans = 0; for (int i=0;i<n;i++) { ans = max(ans, dp[i]); } cout << ans; }
#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...