Submission #838772

# Submission time Handle Problem Language Result Execution time Memory
838772 2023-08-27T17:45:09 Z arbuzick Sequence (APIO23_sequence) C++17
100 / 100
1373 ms 62412 KB
#include <bits/stdc++.h>

using namespace std;

const int R = 1 << 19;

int mn[R * 2], mx[R * 2], psh[R * 2];

void push(int node) {
    if (psh[node] != 0) {
        mn[node * 2] += psh[node];
        mx[node * 2] += psh[node];
        psh[node * 2] += psh[node];
        mn[node * 2 + 1] += psh[node];
        mx[node * 2 + 1] += psh[node];
        psh[node * 2 + 1] += psh[node];
    }
    psh[node] = 0;
}

void add(int ql, int qr, int val, int node = 1, int nl = 0, int nr = R) {
    if (ql <= nl && nr <= qr) {
        mn[node] += val;
        mx[node] += val;
        psh[node] += val;
        return;
    }
    if (qr <= nl || nr <= ql) {
        return;
    }
    push(node);
    int nm = (nl + nr) / 2;
    add(ql, qr, val, node * 2, nl, nm);
    add(ql, qr, val, node * 2 + 1, nm, nr);
    mn[node] = min(mn[node * 2], mn[node * 2 + 1]);
    mx[node] = max(mx[node * 2], mx[node * 2 + 1]);
}

pair<int, int> get(int ql, int qr, int node = 1, int nl = 0, int nr = R) {
    if (ql <= nl && nr <= qr) {
        return {mn[node], mx[node]};
    }
    if (qr <= nl || nr <= ql) {
        return {R, -R};
    }
    push(node);
    int nm = (nl + nr) / 2;
    auto p1 = get(ql, qr, node * 2, nl, nm), p2 = get(ql, qr, node * 2 + 1, nm, nr);
    mn[node] = min(mn[node * 2], mn[node * 2 + 1]);
    mx[node] = max(mx[node * 2], mx[node * 2 + 1]);
    return {min(p1.first, p2.first), max(p1.second, p2.second)};
}

int sequence(int n, vector<int> a) {
    vector<vector<int>> pos(n);
    for (int i = 0; i < n; ++i) {
        a[i]--;
        pos[a[i]].push_back(i);
    }
    for (int i = 0; i < n; ++i) {
        add(i + 1, n + 1, 1);
    }
    int ans = 1;
    vector<int> pr_min1(n), pr_min2(n), pr_max1(n), pr_max2(n), suf_min1(n), suf_min2(n), suf_max1(n), suf_max2(n);
    for (int vl = 0; vl < n; ++vl) {
        for (int i = 0; i < (int)pos[vl].size(); ++i) {
            auto p = get(0, pos[vl][i] + 1);
            pr_min1[i] = p.first;
            pr_max1[i] = p.second;
            p = get(pos[vl][i] + 1, n + 1);
            suf_min1[i] = p.first;
            suf_max1[i] = p.second;
        }
        for (auto p : pos[vl]) {
            add(p + 1, n + 1, -2);
        }
        for (int i = 0; i < (int)pos[vl].size(); ++i) {
            auto p = get(0, pos[vl][i] + 1);
            pr_min2[i] = p.first;
            pr_max2[i] = p.second;
            p = get(pos[vl][i] + 1, n + 1);
            suf_min2[i] = p.first;
            suf_max2[i] = p.second;
        }
        int l = 1, r = pos[vl].size() + 1;
        while (l < r - 1) {
            int m = (l + r) / 2;
            bool check = false;
            for (int i = 0; i + m <= (int)pos[vl].size(); ++i) {
                if (pr_min1[i] <= suf_max1[i + m - 1] && suf_min1[i + m - 1] <= pr_max1[i]) {
                    check = true;
                } else if (pr_min2[i] <= suf_max2[i + m - 1] && suf_min2[i + m - 1] <= pr_max2[i]) {
                    check = true;
                } else if (pr_max1[i] <= suf_min1[i + m - 1] && suf_max2[i + m - 1] <= pr_min2[i]) {
                    check = true;
                } else if (suf_max1[i] <= pr_min1[i + m - 1] && pr_max2[i + m - 1] <= suf_min2[i]) {
                    check = true;
                }
            }
            if (check) {
                l = m;
            } else {
                r = m;
            }
        }
        ans = max(ans, l);
    }
    return ans;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 468 KB Output is correct
11 Correct 1 ms 468 KB Output is correct
12 Correct 1 ms 468 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 468 KB Output is correct
11 Correct 1 ms 468 KB Output is correct
12 Correct 1 ms 468 KB Output is correct
13 Correct 4 ms 596 KB Output is correct
14 Correct 5 ms 596 KB Output is correct
15 Correct 4 ms 596 KB Output is correct
16 Correct 4 ms 596 KB Output is correct
17 Correct 4 ms 596 KB Output is correct
18 Correct 4 ms 596 KB Output is correct
19 Correct 5 ms 596 KB Output is correct
20 Correct 6 ms 596 KB Output is correct
21 Correct 4 ms 596 KB Output is correct
22 Correct 4 ms 596 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1071 ms 56640 KB Output is correct
3 Correct 1063 ms 56768 KB Output is correct
4 Correct 1006 ms 46520 KB Output is correct
5 Correct 1049 ms 55544 KB Output is correct
6 Correct 1046 ms 55652 KB Output is correct
7 Correct 1024 ms 47300 KB Output is correct
8 Correct 1016 ms 47480 KB Output is correct
9 Correct 1018 ms 46544 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 955 ms 46652 KB Output is correct
3 Correct 919 ms 46512 KB Output is correct
4 Correct 1008 ms 46516 KB Output is correct
5 Correct 1038 ms 46652 KB Output is correct
6 Correct 1030 ms 46688 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1108 ms 62412 KB Output is correct
2 Correct 1122 ms 62404 KB Output is correct
3 Correct 1116 ms 61804 KB Output is correct
4 Correct 1122 ms 61796 KB Output is correct
5 Correct 1119 ms 58384 KB Output is correct
6 Correct 1132 ms 58384 KB Output is correct
7 Correct 1046 ms 57212 KB Output is correct
8 Correct 1086 ms 56904 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 468 KB Output is correct
11 Correct 1 ms 468 KB Output is correct
12 Correct 1 ms 468 KB Output is correct
13 Correct 4 ms 596 KB Output is correct
14 Correct 5 ms 596 KB Output is correct
15 Correct 4 ms 596 KB Output is correct
16 Correct 4 ms 596 KB Output is correct
17 Correct 4 ms 596 KB Output is correct
18 Correct 4 ms 596 KB Output is correct
19 Correct 5 ms 596 KB Output is correct
20 Correct 6 ms 596 KB Output is correct
21 Correct 4 ms 596 KB Output is correct
22 Correct 4 ms 596 KB Output is correct
23 Correct 186 ms 9384 KB Output is correct
24 Correct 160 ms 9384 KB Output is correct
25 Correct 187 ms 9392 KB Output is correct
26 Correct 175 ms 8288 KB Output is correct
27 Correct 177 ms 8268 KB Output is correct
28 Correct 173 ms 8280 KB Output is correct
29 Correct 163 ms 7880 KB Output is correct
30 Correct 165 ms 7884 KB Output is correct
31 Correct 157 ms 8128 KB Output is correct
32 Correct 134 ms 10292 KB Output is correct
33 Correct 156 ms 9164 KB Output is correct
34 Correct 177 ms 9164 KB Output is correct
35 Correct 177 ms 9148 KB Output is correct
36 Correct 180 ms 9280 KB Output is correct
37 Correct 166 ms 9164 KB Output is correct
38 Correct 187 ms 9124 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 468 KB Output is correct
11 Correct 1 ms 468 KB Output is correct
12 Correct 1 ms 468 KB Output is correct
13 Correct 4 ms 596 KB Output is correct
14 Correct 5 ms 596 KB Output is correct
15 Correct 4 ms 596 KB Output is correct
16 Correct 4 ms 596 KB Output is correct
17 Correct 4 ms 596 KB Output is correct
18 Correct 4 ms 596 KB Output is correct
19 Correct 5 ms 596 KB Output is correct
20 Correct 6 ms 596 KB Output is correct
21 Correct 4 ms 596 KB Output is correct
22 Correct 4 ms 596 KB Output is correct
23 Correct 1071 ms 56640 KB Output is correct
24 Correct 1063 ms 56768 KB Output is correct
25 Correct 1006 ms 46520 KB Output is correct
26 Correct 1049 ms 55544 KB Output is correct
27 Correct 1046 ms 55652 KB Output is correct
28 Correct 1024 ms 47300 KB Output is correct
29 Correct 1016 ms 47480 KB Output is correct
30 Correct 1018 ms 46544 KB Output is correct
31 Correct 955 ms 46652 KB Output is correct
32 Correct 919 ms 46512 KB Output is correct
33 Correct 1008 ms 46516 KB Output is correct
34 Correct 1038 ms 46652 KB Output is correct
35 Correct 1030 ms 46688 KB Output is correct
36 Correct 1108 ms 62412 KB Output is correct
37 Correct 1122 ms 62404 KB Output is correct
38 Correct 1116 ms 61804 KB Output is correct
39 Correct 1122 ms 61796 KB Output is correct
40 Correct 1119 ms 58384 KB Output is correct
41 Correct 1132 ms 58384 KB Output is correct
42 Correct 1046 ms 57212 KB Output is correct
43 Correct 1086 ms 56904 KB Output is correct
44 Correct 186 ms 9384 KB Output is correct
45 Correct 160 ms 9384 KB Output is correct
46 Correct 187 ms 9392 KB Output is correct
47 Correct 175 ms 8288 KB Output is correct
48 Correct 177 ms 8268 KB Output is correct
49 Correct 173 ms 8280 KB Output is correct
50 Correct 163 ms 7880 KB Output is correct
51 Correct 165 ms 7884 KB Output is correct
52 Correct 157 ms 8128 KB Output is correct
53 Correct 134 ms 10292 KB Output is correct
54 Correct 156 ms 9164 KB Output is correct
55 Correct 177 ms 9164 KB Output is correct
56 Correct 177 ms 9148 KB Output is correct
57 Correct 180 ms 9280 KB Output is correct
58 Correct 166 ms 9164 KB Output is correct
59 Correct 187 ms 9124 KB Output is correct
60 Correct 1322 ms 56676 KB Output is correct
61 Correct 1270 ms 56640 KB Output is correct
62 Correct 1346 ms 56628 KB Output is correct
63 Correct 1226 ms 48588 KB Output is correct
64 Correct 1125 ms 48512 KB Output is correct
65 Correct 1233 ms 48504 KB Output is correct
66 Correct 1077 ms 46660 KB Output is correct
67 Correct 1112 ms 46788 KB Output is correct
68 Correct 957 ms 48948 KB Output is correct
69 Correct 1067 ms 62408 KB Output is correct
70 Correct 1373 ms 55756 KB Output is correct
71 Correct 1286 ms 55584 KB Output is correct
72 Correct 1229 ms 55020 KB Output is correct
73 Correct 1277 ms 55440 KB Output is correct
74 Correct 1246 ms 55072 KB Output is correct
75 Correct 1162 ms 55484 KB Output is correct