不会写代码的萌新初学树状数组,悬小号1关注
查看原帖
不会写代码的萌新初学树状数组,悬小号1关注
378467
Windy_YY楼主2024/7/5 22:14
bool begmem;
#include <bits/stdc++.h>
#define int long long
using namespace std;
class FastIO {
public:
    int read() {
        int o = 1, x; char ch;
        while (!isdigit(ch = getchar())) {
            if (ch == '-') {
                o = -1;
            }
        }
        x = ch ^ 48;
        while (isdigit(ch = getchar())) {
            x = (x << 3) + (x << 1) + (ch ^ 48);
        }
        return o * x;
    }
} ; FastIO io;

void calcqwq();
const int N = 500100, inf = 1e18;
inline int max(int a, int b) { return a > b ? a : b; }
inline int min(int a, int b) { return a < b ? a : b; }
inline void swap(int &a, int &b) { a ^= b ^= a ^= b; }
int a[N], f[N], g[N], n, tr[N];
void add(int x, int v) { for (; x < N; x += (x &- x)) tr[x] = max(tr[x], v); }
int query(int x) { int s = 0; for (; x; x -= (x &- x)) s = max(s, tr[x]); return s; }
int query(int l, int r) { return query(r) - query(l - 1); }
struct qwq { int x, id; } b[N];
signed main() {
    atexit(calcqwq);
    n = io.read();
    for (int i = 1; i <= n; ++i) a[i] = io.read(), b[i].x = a[i], b[i].id = i;
    sort(b + 1, b + n + 1, [&](auto l, auto r) { return l.x < r.x; });
    int idx = 1; map<int, int> mp;
    for (int i = 1; i <= n; ++i) if (b[i].x != b[i - 1].x || i == 1) {
        if (b[i].x - b[i - 1].x == 1 || i == 1) mp[b[i].x] = ++idx;
        else mp[b[i].x] = (idx += 2);
    } idx++;
    for (int i = 1; i <= n; ++i) a[i] = mp[a[i]];
    for (int i = 1; i <= n; ++i) cout << a[i] << ' '; cout << '\n';
    for (int i = 1; i <= n; ++i) {
        f[i] = query(a[i] - 1) + 1;
        add(a[i], f[i]);
    } memset(tr, 0, sizeof tr);
    for (int i = n; i; i--) {
        g[i] = query(a[i] + 1, N - 1) + 1;
        add(a[i], g[i]);
    } memset(tr, 0, sizeof tr);
    for (int i = 1; i <= n; ++i) cout << f[i] << ' '; cout << '\n';
    for (int i = 1; i <= n; ++i) cout << g[i] << ' '; cout << '\n';
    int mx = 0;
    for (int i = 3; i <= n; ++i) {
        add(a[i - 2], f[i]);
        mx = max(mx, g[i] + query(a[i] - 2) + 1);
    } cout << mx << '\n';
    return 0;
}
bool endmem;
void calcqwq() {
    fprintf(stderr, "Memory = %.5lf\n", (&begmem - &endmem) / 1048576.);
}

菜到了一定程度啥也不会的小萌新求看一下 gg 数组哪里求错了,瞪了一个小时了/kk,真的不会写代码了/ll

2024/7/5 22:14
加载中...