Submission #1308160

#TimeUsernameProblemLanguageResultExecution timeMemory
1308160khf7000Global Warming (CEOI18_glo)C++20
100 / 100
150 ms6984 KiB
#include <bits/stdc++.h> // #pragma GCC optimize("Ofast") using namespace std; typedef pair<int, int> pii; typedef long long ll; int inf = 1e9 + 1; int mod = 1e9 + 7; int query (vector<int> &seg, int node, int start, int end, int left, int right) { if (right < start || end < left) return 0; if (left <= start && end <= right) return seg[node]; int mid = (start + end) / 2; return max(query(seg, node * 2, start, mid, left, right), query(seg, node * 2 + 1, mid + 1, end, left, right)); } void update (vector<int> &seg, int node, int start, int end, int target, int val) { if (target < start || end < target) return; if (start == end) { seg[node] = max(seg[node], val); return; } int mid = (start + end) / 2; update(seg, node * 2, start, mid, target, val); update(seg, node * 2 + 1, mid + 1, end, target, val); seg[node] = max(seg[node * 2], seg[node * 2 + 1]); } int main() { cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false); int n, x; cin >> n >> x; vector<int> a (n, 0); for(int i = 0; i < n; i++) { cin >> a[i]; } vector<int> v; vector<int> pre (n, 0); for(int i = 0; i < n; i++) { auto it = lower_bound(v.begin(), v.end(), a[i]); int j = it - v.begin(); if (it == v.end()) { v.push_back(a[i]); } else { v[j] = a[i]; } pre[i] = j + 1; } v.clear(); vector<int> suf (n, 0); for(int i = n - 1; i >= 0; i--) { auto it = lower_bound(v.begin(), v.end(), -a[i]); int j = it - v.begin(); if (it == v.end()) { v.push_back(-a[i]); } else { v[j] = -a[i]; } suf[i] = j + 1; } vector<int> b (n, 0); for(int i = 0; i < n; i++) { b[i] = a[i] + x; } sort(b.begin(), b.end()); b.erase(unique(b.begin(), b.end()), b.end()); // printf("pre: "); // for(int i = 0; i < n; i++) { // printf("%d ", pre[i]); // } // printf("\nsuf: "); // for(int i = 0; i < n; i++) { // printf("%d ", suf[i]); // } // printf("\nb: "); // for(int i = 0; i < b.size(); i++) { // printf("%d ", b[i]); // } // printf("\n"); int m = (int)b.size(); vector<int> seg (4*m, 0); int ans = *max_element(pre.begin(), pre.end()); for(int i = n - 1; i > 0; i--) { int j = lower_bound(b.begin(), b.end(), a[i] + x) - b.begin(); update(seg, 1, 0, m - 1, j, suf[i]); int k = upper_bound(b.begin(), b.end(), a[i - 1]) - b.begin(); if (k < m) { ans = max(ans, pre[i - 1] + query(seg, 1, 0, m - 1, k, m - 1)); } } cout << ans << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...