Submission #1207019

#TimeUsernameProblemLanguageResultExecution timeMemory
1207019trimkusBouquet (EGOI24_bouquet)C++20
100 / 100
103 ms14408 KiB
#include <bits/stdc++.h> using namespace std; struct Fenwick { int n; vector<int> bit; Fenwick(int n) { this->n = n; bit = vector<int>(n + 2); } void update(int i, int delta) { i++; for (; i <= n + 1; i += i & -i) { bit[i] = max(bit[i], delta); } } int query(int i) { int res = 0; i++; for (; i > 0; i -= i & -i) { res = max(res, bit[i]); } return res; } }; int main() { int n; cin >> n; vector<int> l(n + 1), r(n + 1); for (int i = 1; i <= n; ++i) { cin >> l[i] >> r[i]; } Fenwick tree(n); vector<int> dp(n + 2); vector<vector<int>> events(n + 2); for (int i = 1; i <= n; ++i) { for (auto& u : events[i]) { tree.update(u, dp[u]); } int left = max(0, i - l[i] - 1); int right = min(n + 1, i + r[i] + 1); dp[i] = 1 + tree.query(left); events[right].push_back(i); //~ cout << dp[i] << " "; } //~ cout << "\n"; //~ vector<vector<int>> dp(n + 1, vector<int>(n + 1)); //~ for (int i = 1; i <= n; ++i) { //~ for (int j = 1; j <= n; ++j) { //~ dp[i][j] = dp[i - 1][j]; //~ } //~ int left = max(0, i - l[i] - 1); //~ for (int j = 0; j <= left; ++j) { //~ int right = j + r[j] + 1; //~ if (i >= right) { //~ dp[i][i] = max(dp[i][i], dp[i - 1][j] + 1); //~ } //~ } //~ } int res = 0; for (int i = 0; i <= n + 1; ++i) { res = max(res, dp[i]); } cout << res << "\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...