#include <bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
typedef vector<ll> vll;
ll getResult(vll &v)
{
vll items, result;
for (int i = v.size() -1; i >= 0; --i) {
int idx = lower_bound(items.begin(), items.end(), -v[i]) - items.begin();
while (!items.empty() && -v[i] < items.back()) items.pop_back();
if (idx >= items.size()) items.pb(-v[i]);
else items[idx] = -v[i];
result.pb(items.size());
}
ll mx = 0;
for (int i = 0; i < result.size(); ++i) {
mx = max(result[i], mx);
}
return mx;
}
int main()
{
ios_base::sync_with_stdio(0);
int n;
cin >> n;
vll v(2*n);
for (int i = 0; i < n; ++i) {
cin >> v[i];
v[i+n] = v[i];
}
cout << getResult(v);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <bits/stdc++.h> #define pb push_back using namespace std; typedef long long ll; typedef vector<ll> vll; ll getResult(vll &v) { vll items, result; for (int i = v.size() -1; i >= 0; --i) { int idx = lower_bound(items.begin(), items.end(), -v[i]) - items.begin(); while (!items.empty() && -v[i] < items.back()) items.pop_back(); if (idx >= items.size()) items.pb(-v[i]); else items[idx] = -v[i]; result.pb(items.size()); } ll mx = 0; for (int i = 0; i < result.size(); ++i) { mx = max(result[i], mx); } return mx; } int main() { ios_base::sync_with_stdio(0); int n; cin >> n; vll v(2*n); for (int i = 0; i < n; ++i) { cin >> v[i]; v[i+n] = v[i]; } cout << getResult(v); } |
English