Submission #1228935

#TimeUsernameProblemLanguageResultExecution timeMemory
1228935pumkinheadBouquet (EGOI24_bouquet)C++20
100 / 100
209 ms16060 KiB
#include <bits/stdc++.h> using namespace std; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); int n; cin>>n; vector<pair<int, int>> tulips(n); for(int i=0; i<n; i++){ int l, r; cin>>l>>r; l = min(l, i); r = min(r, n-1-i); tulips[i] = {l, r}; } vector<int> segTree((n+1)*4, 0); function<int(int, int, int, int, int)> query = [&](int node, int left, int right, int queryLeft, int queryRight){ if(queryRight < queryLeft) return 0; if(right < queryLeft || queryRight < left) return 0; if(queryLeft <= left && right <= queryRight) return segTree[node]; int mid = (left + right) / 2; return max(query(node*2+1, left, mid, queryLeft, queryRight), query(node*2+2, mid+1, right, queryLeft, queryRight)); }; function<void(int, int, int, int, int)> update = [&](int node, int left, int right, int pos, int value){ if(right < pos || pos < left) return; if(left == right){ segTree[node] = max(segTree[node], value); return; } int mid = (left+right) / 2; update(node*2+1, left, mid, pos, value); update(node*2+2, mid+1, right, pos, value); segTree[node] = max(segTree[node*2+1], segTree[node*2+2]); }; vector<vector<pair<int, int>>> add(n+1); for(int i=0; i<=n; i++){ for(pair<int, int> adding : add[i]){ update(0, 0, n, adding.first, adding.second); } int curDp = query(0, 0, n, 0, i); update(0, 0, n, i, curDp); if(i >= n) continue; pair<int, int> tulip = tulips[i]; int value = query(0, 0, n, 0, i-1-tulip.first) + 1; if(tulip.second == 0){ update(0, 0, n, i, value); }else{ add[i+tulip.second+1].push_back({i, value}); } } cout<<query(0, 0, n, 0, n); }
#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...