Submission #1196880

#TimeUsernameProblemLanguageResultExecution timeMemory
1196880LucaLucaMGlobal Warming (CEOI18_glo)C++20
100 / 100
297 ms9108 KiB
#include <iostream> #include <vector> #include <algorithm> #include <cassert> #include <map> using ll = long long; #define debug(x) #x << " = " << x << '\n' const int NMAX = 2e5; const int INF = 1e9; int a[NMAX + 1]; int prefLis[NMAX + 1]; int suffLis[NMAX + 1]; struct Fenwick { int n; std::vector<int> aib; Fenwick() {} void init(int _n) { n = _n + 1; aib.resize(n + 1); aib.assign(n + 1, 0); } void update(int pos, int value) { for (; pos <= n; pos += pos & -pos) { aib[pos] = std::max(aib[pos], value); } } int query(int pos) { int ret = 0; for (; pos > 0; pos -= pos & -pos) { ret = std::max(ret, aib[pos]); } return ret; } }; int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); #endif std::ios_base::sync_with_stdio(false); std::cin.tie(0); int n, X; std::cin >> n >> X; std::vector<int> norm; for (int i = 1; i <= n; i++) { std::cin >> a[i]; norm.push_back(a[i]); norm.push_back(-a[i]); norm.push_back(X + a[i] - 1); norm.push_back(-(a[i] - X + 1)); } std::sort(norm.begin(), norm.end()); norm.erase(std::unique(norm.begin(), norm.end()), norm.end()); auto get = [&](int x) { return std::lower_bound(norm.begin(), norm.end(), x) - norm.begin() + 1; }; Fenwick aib; aib.init((int) norm.size() + 1); for (int i = 1; i <= n; i++) { prefLis[i] = 1 + aib.query(get(a[i]) - 1); aib.update(get(a[i]), prefLis[i]); } aib.init((int) norm.size() + 1); for (int i = n; i > 0; i--) { suffLis[i] = 1 + aib.query(get(-a[i]) - 1); aib.update(get(-a[i]), suffLis[i]); } aib.init((int) norm.size() + 1); int answer = 0; for (int i = 1; i <= n; i++) { answer = std::max(answer, prefLis[i]); } for (int i = 1; i <= n; i++) { answer = std::max(answer, suffLis[i] + aib.query(get(X + a[i] - 1))); aib.update(get(a[i]), prefLis[i]); } aib.init((int) norm.size() + 1); for (int i = n; i > 0; i--) { // -a[j] <= -(a[i] - X + 1) answer = std::max(answer, prefLis[i] + aib.query(get(-(a[i] - X + 1)))); aib.update(get(-a[i]), suffLis[i]); } std::cout << answer; return 0; }
#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...