Submission #941470

# Submission time Handle Problem Language Result Execution time Memory
941470 2024-03-09T01:46:44 Z LOLOLO Sequence (APIO23_sequence) C++17
0 / 100
2000 ms 99408 KB
#include <bits/stdc++.h>
using namespace std;
typedef  long long ll;

#define           f     first
#define           s     second
#define           pb    push_back
#define           ep    emplace
#define           eb    emplace_back
#define           lb    lower_bound
#define           ub    upper_bound
#define       all(x)    x.begin(), x.end()
#define      rall(x)    x.rbegin(), x.rend()
#define   uniquev(v)    sort(all(v)), (v).resize(unique(all(v)) - (v).begin())
#define     mem(f,x)    memset(f , x , sizeof(f))
#define        sz(x)    (int)(x).size()
#define  __lcm(a, b)    (1ll * ((a) / __gcd((a), (b))) * (b))
#define          mxx    *max_element
#define          mnn    *min_element
#define    cntbit(x)    __builtin_popcountll(x)
#define       len(x)    (int)(x.length())

const int N = 5e5 + 100;
const int M = 2e6;

struct ST{
    int N, v = 0;
    vector <pair <int, int>> seg;
    vector <int> laz;
    ST(int n, int ch) {
        N = n;
        v = ch;
        laz.assign(n * 4 + 100, 0);
        seg.resize(n * 4 + 100);
    }

    pair <int, int> compare(pair <int, int> a, pair <int, int> b) {
        if ((a < b) == v)
            return a;

        return b;
    }

    void build(int id, int l, int r) {
        if (l == r) {
            seg[id] = {0, l};
            return;
        }

        int m = (l + r) / 2;
        build(id * 2, l, m);
        build(id * 2 + 1, m + 1, r);
        seg[id] = compare(seg[id * 2], seg[id * 2 + 1]);
    }

    void push(int id) {
        int &t = laz[id];
        laz[id * 2] += t;
        laz[id * 2 + 1] += t;
        seg[id * 2].f += t;
        seg[id * 2 + 1].f += t;
        t = 0;
    }

    void upd(int id, int l, int r, int u, int v, int c) {
        if (l > v || r < u)
            return;

        if (l >= u && r <= v) {
            seg[id].f += c;
            laz[id] += c;
            return;
        }

        push(id);
        int m = (l + r) / 2;
        upd(id * 2, l, m, u, v, c);
        upd(id * 2 + 1, m + 1, r, u, v, c);
        seg[id] = compare(seg[id * 2], seg[id * 2 + 1]);
    }

    pair <int, int> get(int id, int l, int r, int u, int v) {
        if (u > v)
            return {1, 1};

        if (l >= u && r <= v)
            return seg[id];

        push(id);
        int m = (l + r) / 2;
        if (m + 1 <= u)
            return get(id * 2 + 1, m + 1, r, u, v);

        if (m >= v)
            return get(id * 2, l, m, u, v);

        return compare(get(id * 2, l, m, u, v), get(id * 2 + 1, m + 1, r, u, v));
    }

    int get(int p) {
        return get(1, 0, N, p, p).f;
    }
};

struct seg{
    int N;
    vector <int> st;
    seg(int n) {
        N = n;
        st.assign(n * 4 + 1000, 1e9);
    }

    void upd(int id, int l, int r, int p, int v, int is) {
        if (l > p || r < p)
            return;

        if (l == r) {
            if (is) {
                st[id] = v;
            } else {
                st[id] = min(st[id], v);
            }
            return;
        }

        int m = (l + r) / 2;
        upd(id * 2, l, m, p, v, is);
        upd(id * 2 + 1, m + 1, r, p, v, is);
        st[id] = min(st[id * 2], st[id * 2 + 1]);
    }

    int get(int id, int l, int r, int u, int v) {
        if (l > v || r < u)
            return 1e9;

        if (l >= u && r <= v)
            return st[id];

        int m = (l + r) / 2;
        return min(get(id * 2, l, m, u, v), get(id * 2 + 1, m + 1, r, u, v));
    }
};

vector <int> pos[N];
int a[N], n;

void maximize(int &a, int b) {
    if (a < b) {
        a = b;
    }
}

int get(int add) {
    seg seg(n * 2);
    ST smx(n, 1), smi(n, 0);
    smx.build(1, 0, n);
    smi.build(1, 0, n);

    for (int i = 1; i <= n; i++) {
        smx.upd(1, 0, n, i, n, add);
        smi.upd(1, 0, n, i, n, add);
    }

    int ans = 0, t = 0;

    for (int i = 1; i <= n; i++) {
        for (auto x : pos[i]) {
            smx.upd(1, 0, n, x, n, -add);
            smi.upd(1, 0, n, x, n, -add);
        }

        vector <int> save;
        vector <pair <int, int>> st;
        int lst = 0;
        for (int j = 0; j < sz(pos[i]); j++) {
            int p = smi.get(1, 0, n, lst, pos[i][j] - 1).s;
            save.pb(p);
            p = smx.get(1, 0, n, lst, pos[i][j] - 1).s;
            save.pb(p);
            lst = pos[i][j];
        }

        int p = smx.get(1, 0, n, lst, n).s;
        save.pb(p);
        p = smi.get(1, 0, n, lst, n).s;
        save.pb(p);

        uniquev(save);

        int j = 0;
        for (auto x : save) {
            while (j < sz(pos[i]) && pos[i][j] <= x)
                j++;

            if (x >= 0 && x <= n)
                st.pb({j, smx.get(x)});
        }

        uniquev(st);

        sort(all(st), [&] (pair <int, int> &A, pair <int, int> &B) {return A.s < B.s;} );

        for (auto x : st) {
            maximize(ans, x.f - seg.get(1, 0, n * 2, x.s - x.f + n, n * 2));
            seg.upd(1, 0, n * 2, x.s - x.f + n, x.f, 0);
        }

        for (auto x : st) {
            seg.upd(1, 0, n * 2, x.s - x.f + n, 1e9, 1);
        }

        for (auto x : pos[i]) {
            smx.upd(1, 0, n, x, n, -add);
            smi.upd(1, 0, n, x, n, -add);
        }
    }

    return ans;
}

int sequence(int N, vector <int> A) {
    n = N;
    for (int i = 1; i <= n; i++)
        pos[i].clear();

    for (int i = 1; i <= n; i++) {
        a[i] = A[i - 1];
        pos[a[i]].pb(i);
    }

    int ans = max(get(-1), get(1));

    return ans;
}

int trau(int n, vector <int> A) {
    int ans = 0;
    for (int i = 0; i < sz(A); i++) {
        vector <int> v;
        for (int j = i; j < sz(A); j++) {
            v.pb(A[j]);
            sort(all(v));
            int a = 0, b = -1, c1 = 0, c2 = 0;
            a = v[sz(v) / 2];
            if (sz(v) % 2 == 0)
                b = v[sz(v) / 2 - 1];

            for (auto x : v) {
                if (x == a)
                    c1++;

                if (x == b)
                    c2++;
            }
            ans = max({ans, c1, c2});
        }
    }

    return ans;
}

/*int main() {
    int n = 100;
    for (int i = 1;; i++) {
        vector <int> v;
        for (int j = 0; j < n; j++)
            v.pb((rand() % n) + 1);

        if (trau(n, v) != sequence(n, v)) {
            cout << "WRONG\n";
            break;
        } else {
            cout << "OK\n";
        }
    }

    return 0;
}*/

// 1, 2, 3, 5, 6, 6, 9, 7

Compilation message

sequence.cpp: In function 'int get(int)':
sequence.cpp:164:18: warning: unused variable 't' [-Wunused-variable]
  164 |     int ans = 0, t = 0;
      |                  ^
# Verdict Execution time Memory Grader output
1 Correct 3 ms 13912 KB Output is correct
2 Correct 5 ms 13916 KB Output is correct
3 Correct 4 ms 13916 KB Output is correct
4 Correct 4 ms 13916 KB Output is correct
5 Correct 4 ms 13916 KB Output is correct
6 Correct 3 ms 13988 KB Output is correct
7 Incorrect 4 ms 13916 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3 ms 13912 KB Output is correct
2 Correct 5 ms 13916 KB Output is correct
3 Correct 4 ms 13916 KB Output is correct
4 Correct 4 ms 13916 KB Output is correct
5 Correct 4 ms 13916 KB Output is correct
6 Correct 3 ms 13988 KB Output is correct
7 Incorrect 4 ms 13916 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3 ms 13912 KB Output is correct
2 Execution timed out 2045 ms 93928 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 13916 KB Output is correct
2 Execution timed out 2047 ms 95996 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2019 ms 99408 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3 ms 13912 KB Output is correct
2 Correct 5 ms 13916 KB Output is correct
3 Correct 4 ms 13916 KB Output is correct
4 Correct 4 ms 13916 KB Output is correct
5 Correct 4 ms 13916 KB Output is correct
6 Correct 3 ms 13988 KB Output is correct
7 Incorrect 4 ms 13916 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 3 ms 13912 KB Output is correct
2 Correct 5 ms 13916 KB Output is correct
3 Correct 4 ms 13916 KB Output is correct
4 Correct 4 ms 13916 KB Output is correct
5 Correct 4 ms 13916 KB Output is correct
6 Correct 3 ms 13988 KB Output is correct
7 Incorrect 4 ms 13916 KB Output isn't correct
8 Halted 0 ms 0 KB -