Submission #55159358
Source Code Expand
// https://codeforces.com/blog/entry/96344
// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
#define ATCODER_LIB 1
#ifdef ATCODER_LIB
#include <atcoder/segtree>
#include <atcoder/lazysegtree>
#include <atcoder/dsu>
#include <atcoder/math>
#include <atcoder/modint>
#include <atcoder/fenwicktree>
#define ATCODER_MODINT 1
#ifdef ATCODER_MODINT
using mint = atcoder::static_modint<MOD>;
ostream &operator<<(ostream &os, const mint &mi) { return os << mi.val(); }
#endif
using namespace atcoder;
#endif
#ifndef ONLINE_JUDGE
struct terminal_colors { terminal_colors() { system("color"); } } terminal_colors_;
#endif
struct fast_ios { fast_ios(){ cin.tie(nullptr), ios::sync_with_stdio(false), cout << fixed << setprecision(20); } } fast_ios_;
struct check_cin {
check_cin() {
atexit([]() {
assert("error reading input" && !cin.fail() && !cin.bad() && !cin.eof());
#ifdef DEBUG
string s;
getline(cin, s, char(EOF));
for (char& c : s) {
assert("reading input unfinished" && isspace(c));
}
#endif
});
};
} check_cin_;
using lint = long long;
using pint = std::pair<int,int>;
using plint = std::pair<long long, long long>;
#define mp make_pair
#define fi first
#define se second
#define si(x) int(x.size())
#define all(x) (x).begin(), (x).end()
#define ffor(i, begin, end) for(int i=(begin),i##_end_=(end);i<i##_end_;i++)
#define ifor(i, begin, end) for(int i=(end)-1,i##_begin_=(begin);i>=i##_begin_;i--)
#define rep(i, n) ffor(i,0,n)
#define irep(i, n) ifor(i,0,n)
#define bit(mask,i)((((mask)>>(i))&1) == 1)
template <typename T> bool chmax(T &m, const T q) { return m < q ? (m = q, true) : false; }
template <typename T> bool chmin(T &m, const T q) { return m > q ? (m = q, true) : false; }
const int INF=(1<<30)-1;
const long long LINF=(1ll<<62)-1;
const vector<int> dh={0,1,0,-1},dw={1,0,-1,0};
inline void mod_add(int& val, int addend, int M) {
val = (int)(((int64_t)val+addend)%M);
val = (val + M) % M;
}
inline int ceil_pow2(long long n) {
int x = 0;
while ((1ull << x) < (unsigned long long)(n)) x++;
return x;
}
template <class T> std::vector<T> sort_unique(std::vector<T> vec) { sort(vec.begin(), vec.end()), vec.erase(unique(vec.begin(), vec.end()), vec.end()); return vec; }
template <class T1, class T2> std::pair<T1, T2> operator+(const std::pair<T1, T2> &l, const std::pair<T1, T2> &r) { return std::make_pair(l.first + r.first, l.second + r.second); }
template <class T1, class T2> std::pair<T1, T2> operator-(const std::pair<T1, T2> &l, const std::pair<T1, T2> &r) { return std::make_pair(l.first - r.first, l.second - r.second); }
template <class IStream, class T1, class T2> IStream &operator>>(IStream &is, std::pair<T1, T2> &p) { is >> p.first; is >> p.second; return is; }
template <class IStream, class T> IStream &operator>>(IStream &is, std::vector<T> &vec) { for (auto &v : vec) is >> v; return is; }
/************************FOR DEBUG OUTPUT**************************/
template <class OStream, class T1, class T2>
OStream &operator<<(OStream &os, const pair<T1, T2> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template <class OStream, class T1, class T2, class T3, class T4>
OStream &operator<<(OStream &os, const tuple<T1, T2, T3, T4> &t) { return os << '[' << get<0>(t) << ", " << get<1>(t) << ", " << get<2>(t) << ", " << get<3>(t) << ']'; }
template <class OStream, class T, class = decay_t<decltype(*begin(declval<T>()))>, class = enable_if_t<!is_same<T, string>::value>>
OStream &operator<<(OStream &os, const T &c) {
os << '[';
for (auto it = c.begin(); it != c.end(); ++it)
os << &", "[2 * (it == c.begin())] << *it;
return os << ']';
}
template <class OStream, class T>
OStream &operator<<(OStream &os, queue<T> q) {
vector<T> v;
while (!q.empty()) {
v.push_back(q.front());
q.pop();
}
return os << v;
}
template <class OStream, class T>
OStream &operator<<(OStream &os, stack<T> s) {
vector<T> v;
while (!s.empty()) {
v.push_back(s.top());
s.pop();
}
reverse(v.begin(),v.end());
return os << v;
}
template <class T, class Container, class Comparator>
ostream &operator<<(ostream &os, priority_queue<T, Container, Comparator> q) {
vector<T> v;
while (!q.empty()) {
v.push_back(q.top());
q.pop();
}
return os << v;
}
//support up to 6 args
#define _NTH_ARG(_1, _2, _3, _4, _5, _6, _7, N, ...) N
#define _FE_0(_CALL, ...)
#define _FE_1(_CALL, x) _CALL(x)
#define _FE_2(_CALL, x, ...) _CALL(x) _FE_1(_CALL, __VA_ARGS__)
#define _FE_3(_CALL, x, ...) _CALL(x) _FE_2(_CALL, __VA_ARGS__)
#define _FE_4(_CALL, x, ...) _CALL(x) _FE_3(_CALL, __VA_ARGS__)
#define _FE_5(_CALL, x, ...) _CALL(x) _FE_4(_CALL, __VA_ARGS__)
#define _FE_6(_CALL, x, ...) _CALL(x) _FE_5(_CALL, __VA_ARGS__)
#define FOR_EACH_MACRO(MACRO, ...) \
_NTH_ARG(dummy, ##__VA_ARGS__, _FE_6, _FE_5, _FE_4, _FE_3, _FE_2, _FE_1, _FE_0) \
(MACRO, ##__VA_ARGS__)
const string COLOR_RESET = "\033[0m", BRIGHT_GREEN = "\033[1;32m", BRIGHT_RED = "\033[1;31m", BRIGHT_CYAN = "\033[1;36m", NORMAL_CROSSED = "\033[0;9;37m", RED_BACKGROUND = "\033[1;41m", NORMAL_FAINT = "\033[0;2m";
//Change output format here
#define meta __func__ << ":" << __LINE__ << ": "
#define out(x) "" << BRIGHT_CYAN << #x << COLOR_RESET << " = " << x << ", "
#ifdef DEBUG
#define dbg(...) \
cerr << meta << FOR_EACH_MACRO(out, __VA_ARGS__) << "\n"
#define dbgif(cond, ...) ((cond) ? cerr << meta << FOR_EACH_MACRO(out, __VA_ARGS__) << "\n" : cerr)
#define dbgseg(seg, n) { auto& seg_global{seg}; vector<decltype(seg.all_prod())> seg; for(auto i{0}; i<n; i++) seg.push_back(seg_global.get(i)); dbg(seg); }
#else
#define dbg(x...)
#define dbgif(cond, x...)
#define dbgseg(seg, n)
#endif
template <typename T> vector<vector<T>> vec2(int n,int m,const T t=T()) {
return vector<vector<T>>(n,vector<T>(m, t));
}
template <typename T> vector<vector<vector<T>>> vec3(int n,int m,int l,const T t=T()) {
return vector<vector<vector<T>>>(n,vec2<T>(m,l,t));
}
template <typename T> vector<vector<vector<vector<T>>>> vec4(int n,int m,int l,int l2,const T t=T()) {
return vector<vector<vector<vector<T>>>>(n,vec3<T>(m,l,l2,t));
}
template <typename Iter>
inline void write_range(Iter start, Iter end, string delim=" ") {
if (start != end) cout << *start;
auto cur{++start};
while (cur != end) {
cout << delim << *cur++;
}
cout << endl;
}
int op(int a,int b){return max(a,b);}
int e(){return 0;}
bool f(int x){return (x>0);}
int main() {
int n;
cin >> n;
vector<int> a(n);
cin >> a;
if (n == 1) {
cout << 1 << endl;
exit(0);
}
vector<int> prev(n,-1);
auto lis = [&](const vector<int>& a) {
int n{int(a.size())};
vector<int> by_len{{-INF}};
vector<int> len(n);
map<int, int> val_to_index;
val_to_index[-INF] = -1;
for (int i{0}; i < int(a.size()); i++) {
if (a[i] > by_len.back()) {
prev[i] = val_to_index[by_len.back()];
by_len.push_back(a[i]);
len[i] = int(by_len.size()) - 1;
} else {
auto index{int(lower_bound(by_len.begin(), by_len.end(), a[i]) - by_len.begin())};
by_len[index] = a[i];
len[i] = index;
prev[i] = val_to_index[by_len[index-1]];
}
val_to_index[a[i]] = i;
}
return len;
};
int ans{0};
{
auto tmp{a[0]};
a[0] = 0;
auto len{lis(a)};
chmax(ans, *max_element(all(len)));
a[0] = tmp;
}
{
auto tmp{a.back()};
a.back() = 1'000'000'001;
auto len{lis(a)};
chmax(ans, *max_element(all(len)));
a.back() = tmp;
}
set<int> b_set;
rep(i,n) {
b_set.insert(a[i]);
b_set.insert(a[i]+1);
}
vector<int> b{all(b_set)};
auto compress = [&](auto val) {
return int(upper_bound(all(b), val) - b.begin());
};
dbg(b);
segtree<int, op, e> seg0(si(b)+2);
segtree<int, op, e> seg1(si(b)+2);
vector<pint> pending;
rep(i,n) {
if (i >= 2) {
seg1.set(pending[i-2].fi, pending[i-2].se);
}
auto prv_index{compress(a[i]-1)};
auto index{compress(a[i])};
auto lt0{seg0.prod(0, prv_index+1)};
auto lt1{seg1.prod(0, prv_index+1)};
dbg(lt0,lt1,i,a[i]);
auto nxt_index{compress(a[i]+1)};
seg0.set(index, lt0+1);
seg1.set(index, lt1+1);
auto eq0{seg0.get(index)};
pending.push_back(mp(nxt_index, eq0+1));
dbgseg(seg0, n);
dbgseg(seg1, n);
dbg(seg0.all_prod());
dbg(seg1.all_prod());
}
dbg(seg0.all_prod());
dbg(seg1.all_prod());
ans = max({ans, seg0.all_prod(), seg1.all_prod()});
cout << ans << endl;
return 0;
}
Submission Info
| Submission Time |
|
| Task |
G - Suitable Edit for LIS |
| User |
yzguo |
| Language |
C++ 20 (gcc 12.2) |
| Score |
625 |
| Code Size |
9225 Byte |
| Status |
WA |
| Exec Time |
448 ms |
| Memory |
36824 KiB |
Judge Result
| Set Name |
Sample |
All |
AfterContest |
| Score / Max Score |
0 / 0 |
625 / 625 |
0 / 0 |
| Status |
|
|
|
| Set Name |
Test Cases |
| Sample |
00_sample_00.txt, 00_sample_01.txt |
| All |
00_sample_00.txt, 00_sample_01.txt, 01_internal_00.txt, 01_internal_01.txt, 01_internal_02.txt, 01_internal_03.txt, 01_internal_04.txt, 01_internal_05.txt, 01_internal_06.txt, 01_internal_07.txt, 01_internal_08.txt, 01_internal_09.txt, 01_internal_10.txt, 01_internal_11.txt, 01_internal_12.txt, 01_internal_13.txt, 01_internal_14.txt, 01_internal_15.txt, 01_internal_16.txt, 01_internal_17.txt, 01_internal_18.txt, 01_internal_19.txt, 01_internal_20.txt, 01_internal_21.txt, 01_internal_22.txt, 01_internal_23.txt, 01_internal_24.txt, 01_internal_25.txt, 01_internal_26.txt, 01_internal_27.txt, 01_internal_28.txt, 01_internal_29.txt, 01_internal_30.txt, 01_internal_31.txt, 01_internal_32.txt, 01_internal_33.txt, 01_internal_34.txt, 01_internal_35.txt, 01_internal_36.txt, 01_internal_37.txt, 01_internal_38.txt, 01_internal_39.txt, 01_internal_40.txt, 01_internal_41.txt, 01_internal_42.txt, 01_internal_43.txt, 01_internal_44.txt, 01_internal_45.txt |
| AfterContest |
00_sample_00.txt, 00_sample_01.txt, 01_internal_00.txt, 01_internal_01.txt, 01_internal_02.txt, 01_internal_03.txt, 01_internal_04.txt, 01_internal_05.txt, 01_internal_06.txt, 01_internal_07.txt, 01_internal_08.txt, 01_internal_09.txt, 01_internal_10.txt, 01_internal_11.txt, 01_internal_12.txt, 01_internal_13.txt, 01_internal_14.txt, 01_internal_15.txt, 01_internal_16.txt, 01_internal_17.txt, 01_internal_18.txt, 01_internal_19.txt, 01_internal_20.txt, 01_internal_21.txt, 01_internal_22.txt, 01_internal_23.txt, 01_internal_24.txt, 01_internal_25.txt, 01_internal_26.txt, 01_internal_27.txt, 01_internal_28.txt, 01_internal_29.txt, 01_internal_30.txt, 01_internal_31.txt, 01_internal_32.txt, 01_internal_33.txt, 01_internal_34.txt, 01_internal_35.txt, 01_internal_36.txt, 01_internal_37.txt, 01_internal_38.txt, 01_internal_39.txt, 01_internal_40.txt, 01_internal_41.txt, 01_internal_42.txt, 01_internal_43.txt, 01_internal_44.txt, 01_internal_45.txt, 02_after_contest_00.txt, 02_after_contest_01.txt, 02_after_contest_02.txt, 02_after_contest_03.txt, 02_after_contest_04.txt |
| Case Name |
Status |
Exec Time |
Memory |
| 00_sample_00.txt |
AC |
1 ms |
3508 KiB |
| 00_sample_01.txt |
AC |
1 ms |
3384 KiB |
| 01_internal_00.txt |
AC |
1 ms |
3628 KiB |
| 01_internal_01.txt |
AC |
159 ms |
22872 KiB |
| 01_internal_02.txt |
AC |
12 ms |
5460 KiB |
| 01_internal_03.txt |
AC |
280 ms |
36824 KiB |
| 01_internal_04.txt |
AC |
31 ms |
7648 KiB |
| 01_internal_05.txt |
AC |
89 ms |
7684 KiB |
| 01_internal_06.txt |
AC |
169 ms |
8172 KiB |
| 01_internal_07.txt |
AC |
245 ms |
16708 KiB |
| 01_internal_08.txt |
AC |
245 ms |
16436 KiB |
| 01_internal_09.txt |
AC |
244 ms |
12116 KiB |
| 01_internal_10.txt |
AC |
203 ms |
9220 KiB |
| 01_internal_11.txt |
AC |
192 ms |
8832 KiB |
| 01_internal_12.txt |
AC |
233 ms |
11120 KiB |
| 01_internal_13.txt |
AC |
223 ms |
10500 KiB |
| 01_internal_14.txt |
AC |
21 ms |
7672 KiB |
| 01_internal_15.txt |
AC |
16 ms |
7704 KiB |
| 01_internal_16.txt |
AC |
16 ms |
7548 KiB |
| 01_internal_17.txt |
AC |
31 ms |
7692 KiB |
| 01_internal_18.txt |
AC |
43 ms |
7888 KiB |
| 01_internal_19.txt |
AC |
40 ms |
7672 KiB |
| 01_internal_20.txt |
AC |
64 ms |
8416 KiB |
| 01_internal_21.txt |
AC |
60 ms |
8464 KiB |
| 01_internal_22.txt |
AC |
46 ms |
7760 KiB |
| 01_internal_23.txt |
AC |
149 ms |
16052 KiB |
| 01_internal_24.txt |
AC |
134 ms |
14332 KiB |
| 01_internal_25.txt |
AC |
93 ms |
10732 KiB |
| 01_internal_26.txt |
AC |
189 ms |
23244 KiB |
| 01_internal_27.txt |
AC |
77 ms |
9340 KiB |
| 01_internal_28.txt |
AC |
199 ms |
29572 KiB |
| 01_internal_29.txt |
AC |
25 ms |
7636 KiB |
| 01_internal_30.txt |
AC |
16 ms |
7632 KiB |
| 01_internal_31.txt |
AC |
15 ms |
7660 KiB |
| 01_internal_32.txt |
AC |
56 ms |
7640 KiB |
| 01_internal_33.txt |
AC |
105 ms |
7768 KiB |
| 01_internal_34.txt |
AC |
118 ms |
7984 KiB |
| 01_internal_35.txt |
AC |
183 ms |
8492 KiB |
| 01_internal_36.txt |
AC |
181 ms |
8340 KiB |
| 01_internal_37.txt |
AC |
146 ms |
7960 KiB |
| 01_internal_38.txt |
AC |
157 ms |
8052 KiB |
| 01_internal_39.txt |
AC |
314 ms |
16232 KiB |
| 01_internal_40.txt |
AC |
276 ms |
13420 KiB |
| 01_internal_41.txt |
AC |
448 ms |
30964 KiB |
| 01_internal_42.txt |
AC |
230 ms |
9920 KiB |
| 01_internal_43.txt |
AC |
396 ms |
22952 KiB |
| 01_internal_44.txt |
AC |
1 ms |
3580 KiB |
| 01_internal_45.txt |
AC |
1 ms |
3444 KiB |
| 02_after_contest_00.txt |
AC |
1 ms |
3448 KiB |
| 02_after_contest_01.txt |
AC |
1 ms |
3404 KiB |
| 02_after_contest_02.txt |
AC |
1 ms |
3584 KiB |
| 02_after_contest_03.txt |
AC |
1 ms |
3516 KiB |
| 02_after_contest_04.txt |
WA |
232 ms |
22680 KiB |