Submission #872296

# Submission time Handle Problem Language Result Execution time Memory
872296 2023-11-12T17:23:56 Z green_gold_dog Sequence (APIO23_sequence) C++17
50 / 100
2000 ms 94296 KB
#include "sequence.h"

#include <bits/stdc++.h>

using namespace std;

typedef int ll;

const ll INF = 1'000'000'000;

struct segment_tree_min {
        vector<ll> tree, m;
        ll size;
        segment_tree_min(ll n) {
                size = n;
                tree.resize(size * 4, 0);
                m.resize(size * 4, 0);
        }
        void add(ll v, ll x) {
                tree[v] += x;
                m[v] += x;
        }
        void push(ll v) {
                add(v * 2, m[v]);
                add(v * 2 + 1, m[v]);
                m[v] = 0;
        }
        ll get(ll l, ll r) {
                return get(1, 0, size, l, r);
        }
        ll get(ll v, ll l, ll r, ll ql, ll qr) {
                if (ql <= l && r <= qr) {
                        return tree[v];
                }
                if (qr <= l || r <= ql) {
                        return INF;
                }
                push(v);
                ll mid = (l + r) / 2;
                return min(get(v * 2, l, mid, ql, qr), get(v * 2 + 1, mid, r, ql, qr));
        }
        void add(ll l, ll r, ll x) {
                add(1, 0, size, l, r, x);
        }
        void add(ll v, ll l, ll r, ll ql, ll qr, ll x) {
                if (ql <= l && r <= qr) {
                        add(v, x);
                        return;
                }
                if (qr <= l || r <= ql) {
                        return;
                }
                push(v);
                ll mid = (l + r) / 2;
                add(v * 2, l, mid, ql, qr, x);
                add(v * 2 + 1, mid, r, ql, qr, x);
                tree[v] = min(tree[v * 2], tree[v * 2 + 1]);
        }
};

struct segment_tree_max {
        vector<ll> tree, m;
        ll size;
        segment_tree_max(ll n) {
                size = n;
                tree.resize(size * 4, 0);
                m.resize(size * 4, 0);
        }
        void add(ll v, ll x) {
                tree[v] += x;
                m[v] += x;
        }
        void push(ll v) {
                add(v * 2, m[v]);
                add(v * 2 + 1, m[v]);
                m[v] = 0;
        }
        ll get(ll l, ll r) {
                return get(1, 0, size, l, r);
        }
        ll get(ll v, ll l, ll r, ll ql, ll qr) {
                if (ql <= l && r <= qr) {
                        return tree[v];
                }
                if (qr <= l || r <= ql) {
                        return -INF;
                }
                push(v);
                ll mid = (l + r) / 2;
                return max(get(v * 2, l, mid, ql, qr), get(v * 2 + 1, mid, r, ql, qr));
        }
        void add(ll l, ll r, ll x) {
                add(1, 0, size, l, r, x);
        }
        void add(ll v, ll l, ll r, ll ql, ll qr, ll x) {
                if (ql <= l && r <= qr) {
                        add(v, x);
                        return;
                }
                if (qr <= l || r <= ql) {
                        return;
                }
                push(v);
                ll mid = (l + r) / 2;
                add(v * 2, l, mid, ql, qr, x);
                add(v * 2 + 1, mid, r, ql, qr, x);
                tree[v] = max(tree[v * 2], tree[v * 2 + 1]);
        }
};

ll sequence(ll n, vector<ll> a) {
        segment_tree_min sti(n), stir(n);
        segment_tree_max sta(n), star(n);
        vector<vector<ll>> all(n);
        for (ll i = 0; i < n; i++) {
                sti.add(i, n, 1);
                sta.add(i, n, 1);
                stir.add(0, i + 1, 1);
                star.add(0, i + 1, 1);
                all[a[i] - 1].push_back(i);
        }
        ll ans = 0, ns = n;
        for (ll i = 0; i < n; i++) {
                for (auto j : all[i]) {
                        sti.add(j, n, -1);
                        sti.add(j, n, -1);
                        stir.add(0, j + 1, -1);
                        star.add(0, j + 1, -1);
                        ns--;
                }
                ll lst = 0;
                for (ll j = 0; j < all[i].size(); j++) {
                        ll x = all[i][j];
                        sti.add(x, n, 1);
                        sta.add(x, n, -1);
                        ll m = ns;// + (all[i].size() - j);
                        ll mmi = stir.get(lst, all[i][j] + 1) - ns, mma = star.get(lst, all[i][j] + 1) - ns;
                        ll ql = all[i][j], qr = n;
                        ll v = 1, l = 0, r = n;
                        while (r - l > 1) {
                                sti.push(v);
                                sta.push(v);
                                ll mid = (l + r) / 2;
                                if (mid < ql) {
                                        l = mid;
                                        v = v * 2 + 1;
                                        continue;
                                }
                                ll mi = sti.tree[v * 2 + 1] + mmi, ma = sta.tree[v * 2 + 1] + mma;
                                if ((mi <= -1 && ma >= -1) || (mi <= 0 && ma >= 0) || (mi <= 1 && ma >= 1)) {
                                        v = v * 2 + 1;
                                        l = mid;
                                } else {
                                        v = v * 2;
                                        r = mid;
                                }
                        }
                        ans = max(ans, (ll)((lower_bound(all[i].begin(), all[i].end(), r) - all[i].begin()) - j));
                        lst = all[i][j] + 1;
                }
                for (auto j : all[i]) {
                        sti.add(j, n, -1);
                        sta.add(j, n, -1);
                        stir.add(0, j + 1, -1);
                        star.add(0, j + 1, -1);
                        ns--;
                }
        }
        return ans;
}

Compilation message

sequence.cpp: In function 'll sequence(ll, std::vector<int>)':
sequence.cpp:132:34: warning: comparison of integer expressions of different signedness: 'll' {aka 'int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |                 for (ll j = 0; j < all[i].size(); j++) {
      |                                ~~^~~~~~~~~~~~~~~
sequence.cpp:136:28: warning: unused variable 'm' [-Wunused-variable]
  136 |                         ll m = ns;// + (all[i].size() - j);
      |                            ^
sequence.cpp:138:44: warning: unused variable 'qr' [-Wunused-variable]
  138 |                         ll ql = all[i][j], qr = n;
      |                                            ^~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 344 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 344 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 6 ms 604 KB Output is correct
14 Correct 5 ms 604 KB Output is correct
15 Correct 5 ms 600 KB Output is correct
16 Correct 7 ms 604 KB Output is correct
17 Correct 6 ms 600 KB Output is correct
18 Correct 5 ms 604 KB Output is correct
19 Correct 5 ms 604 KB Output is correct
20 Correct 5 ms 604 KB Output is correct
21 Correct 5 ms 780 KB Output is correct
22 Correct 5 ms 604 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Execution timed out 2048 ms 88444 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Execution timed out 2076 ms 81660 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2052 ms 94296 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 344 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 6 ms 604 KB Output is correct
14 Correct 5 ms 604 KB Output is correct
15 Correct 5 ms 600 KB Output is correct
16 Correct 7 ms 604 KB Output is correct
17 Correct 6 ms 600 KB Output is correct
18 Correct 5 ms 604 KB Output is correct
19 Correct 5 ms 604 KB Output is correct
20 Correct 5 ms 604 KB Output is correct
21 Correct 5 ms 780 KB Output is correct
22 Correct 5 ms 604 KB Output is correct
23 Correct 320 ms 14332 KB Output is correct
24 Correct 331 ms 14672 KB Output is correct
25 Correct 343 ms 14560 KB Output is correct
26 Correct 308 ms 13640 KB Output is correct
27 Correct 317 ms 13420 KB Output is correct
28 Correct 313 ms 13548 KB Output is correct
29 Correct 318 ms 13368 KB Output is correct
30 Correct 307 ms 13440 KB Output is correct
31 Correct 359 ms 13552 KB Output is correct
32 Correct 307 ms 15468 KB Output is correct
33 Correct 329 ms 14368 KB Output is correct
34 Correct 328 ms 14380 KB Output is correct
35 Correct 334 ms 14312 KB Output is correct
36 Correct 310 ms 14324 KB Output is correct
37 Correct 333 ms 14420 KB Output is correct
38 Correct 337 ms 14384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 344 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 6 ms 604 KB Output is correct
14 Correct 5 ms 604 KB Output is correct
15 Correct 5 ms 600 KB Output is correct
16 Correct 7 ms 604 KB Output is correct
17 Correct 6 ms 600 KB Output is correct
18 Correct 5 ms 604 KB Output is correct
19 Correct 5 ms 604 KB Output is correct
20 Correct 5 ms 604 KB Output is correct
21 Correct 5 ms 780 KB Output is correct
22 Correct 5 ms 604 KB Output is correct
23 Execution timed out 2048 ms 88444 KB Time limit exceeded
24 Halted 0 ms 0 KB -