You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.0 KiB
C++
142 lines
4.0 KiB
C++
#define _CRT_SECURE_NO_WARNINGS
|
|
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
|
|
#include <bits/stdc++.h>
|
|
using namespace std;
|
|
#define CR(t, x) const t &x
|
|
#define CLS(x) memset(x, 0, sizeof(x))
|
|
const int maxn = 3e5 + 5;
|
|
int a[maxn];
|
|
int from[maxn];
|
|
int di[maxn];
|
|
int ans[maxn];
|
|
int Len[maxn];
|
|
int n;
|
|
void upup_right()
|
|
{
|
|
//right_est
|
|
CLS(from);
|
|
CLS(di);
|
|
CLS(ans);
|
|
CLS(Len);
|
|
ans[1] = a[1];
|
|
di[1] = 1;
|
|
Len[1] = 1;
|
|
int len = 1;
|
|
for (int i = 2; i <= n; i++)
|
|
{
|
|
if (a[i] > ans[len])
|
|
{
|
|
ans[++len] = a[i];
|
|
di[len] = i;
|
|
from[i] = di[len - 1];
|
|
Len[i] = len;
|
|
}
|
|
else
|
|
{
|
|
int pos = lower_bound(ans, ans + len, a[i]) - ans;
|
|
from[i] = di[pos - 1];
|
|
ans[pos] = a[i];
|
|
di[pos] = i;
|
|
Len[i] = pos;
|
|
}
|
|
}
|
|
/*printf("%d\n", len);
|
|
for (int i = 1; i <= n; i++) printf("%d ", from[i]);
|
|
putchar('\n');*/
|
|
}
|
|
void upup_left()
|
|
{
|
|
//left_est
|
|
CLS(from);
|
|
CLS(di);
|
|
CLS(ans);
|
|
CLS(Len);
|
|
ans[1] = a[1];
|
|
di[1] = 1;
|
|
Len[1] = 1;
|
|
int len = 1;
|
|
for (int i = 2; i <= n; i++)
|
|
{
|
|
if (a[i] > ans[len])
|
|
{
|
|
ans[++len] = a[i];
|
|
di[len] = i;
|
|
from[i] = di[len - 1];
|
|
Len[i] = len;
|
|
}
|
|
else
|
|
{
|
|
int pos = lower_bound(ans, ans + len, a[i]) - ans;
|
|
Len[i] = pos;
|
|
if (a[i] != ans[pos])
|
|
{
|
|
from[i] = di[pos - 1];
|
|
ans[pos] = a[i];
|
|
di[pos] = i;
|
|
}
|
|
}
|
|
}
|
|
/*printf("%d\n", len);
|
|
for (int i = 1; i <= n; i++) printf("%d ", from[i]);
|
|
putchar('\n');*/
|
|
}
|
|
int idx1[maxn], idx2[maxn], idx3[maxn], idx4[maxn];
|
|
int len1[maxn], len2[maxn], len3[maxn], len4[maxn];
|
|
int main()
|
|
{
|
|
vector<int> st;
|
|
while (~scanf("%d", &n))
|
|
{
|
|
for (int i = 1; i <= n; i++)
|
|
scanf("%d", &a[i]);
|
|
upup_left();
|
|
//memcpy(idx1, from, sizeof(from));
|
|
memcpy(len1, Len, sizeof(Len));
|
|
memset(idx1, 0x3f, sizeof(idx1)), *idx1 = 0;
|
|
for (int i = 1; i <= n; i++)
|
|
idx1[len1[i]] = min(idx1[len1[i]], i);
|
|
upup_right();
|
|
//memcpy(idx3, from, sizeof(from));
|
|
memcpy(len3, Len, sizeof(Len));
|
|
memset(idx3, 0x3f, sizeof(idx3)), *idx3 = 0;
|
|
for (int i = 1; i <= n; i++)
|
|
idx3[len3[i]] = min(idx3[len3[i]], i);
|
|
for (int i = 1, j = n; i < j;) swap(a[i++], a[j--]);
|
|
upup_right();
|
|
//memcpy(idx2, from, sizeof(from));
|
|
memcpy(len2, Len, sizeof(Len));
|
|
memset(idx2, 0, sizeof(idx2)), *idx2 = 0;
|
|
for (int i = 1; i <= n; i++)
|
|
idx2[len2[i]] = max(idx2[len2[i]], i);
|
|
upup_left();
|
|
//memcpy(idx4, from, sizeof(from));
|
|
memcpy(len4, Len, sizeof(Len));
|
|
memset(idx4, 0x3f, sizeof(idx4)), *idx4 = 0;
|
|
for (int i = 1; i <= n; i++)
|
|
idx4[len1[4]] = min(idx4[len4[i]], i);
|
|
int idx = 0, _ans = 0;
|
|
for (int i = 1; i <= n; i++)
|
|
printf("%d ", len1[i]);
|
|
putchar('\n');
|
|
for (int i = 1; i <= n; i++)
|
|
printf("%d ", len2[n - i + 1]);
|
|
putchar('\n');
|
|
for (int i = 1; i <= n; i++)
|
|
printf("%d ", idx1[i]);
|
|
putchar('\n');
|
|
for (int i = 1; i <= n; i++)
|
|
printf("%d ", idx2[n - i + 1]);
|
|
putchar('\n');
|
|
for (int i = 1; i <= n; i++)
|
|
if (len1[i] + len2[n - i + 1] > _ans) _ans = len1[i] + len2[n - i + 1], idx = i;
|
|
st.clear();
|
|
for (int tmp = len1[idx]; tmp; tmp--)
|
|
st.push_back(idx1[tmp]);
|
|
for (; !st.empty(); st.pop_back())
|
|
printf("%d ", st.back());
|
|
for (int tmp = len2[n-idx+1] - 1; tmp; tmp--)
|
|
printf("%d ", n - idx2[tmp] + 1);
|
|
putchar('\n');
|
|
}
|
|
return 0;
|
|
} |