#include <vector>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxN = 1e6 + 10;
int t[maxN];
struct Q
{
int bottom, i, N;
vector<int> tval;
vector<int> ti;
Q(int N) : bottom(0), i(0), N(N) {}
int size() { return tval.size() - bottom; }
int add(int x)
{
while (size() && i - ti[bottom] > N - 1)
bottom++;
while (size() && tval.back() <= x)
{
tval.pop_back();
ti.pop_back();
}
tval.push_back(x);
ti.push_back(i++);
return size();
}
};
int main()
{
int N;
scanf("%d", &N);
for (int i = 0; i < N; ++i)
scanf("%d", t + i);
int result = 0;
Q q(N);
for (int i = 2 * N - 1; i >= 0; i--)
result = max(result, q.add(t[i % N]));
printf("%d\n", result);
return 0;
}
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 <vector> #include <cstdio> #include <algorithm> using namespace std; const int maxN = 1e6 + 10; int t[maxN]; struct Q { int bottom, i, N; vector<int> tval; vector<int> ti; Q(int N) : bottom(0), i(0), N(N) {} int size() { return tval.size() - bottom; } int add(int x) { while (size() && i - ti[bottom] > N - 1) bottom++; while (size() && tval.back() <= x) { tval.pop_back(); ti.pop_back(); } tval.push_back(x); ti.push_back(i++); return size(); } }; int main() { int N; scanf("%d", &N); for (int i = 0; i < N; ++i) scanf("%d", t + i); int result = 0; Q q(N); for (int i = 2 * N - 1; i >= 0; i--) result = max(result, q.add(t[i % N])); printf("%d\n", result); return 0; } |
English