提出 #55077176


ソースコード 拡げる

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using ld = long double;
using pl = pair<ll, ll>;
constexpr ll INF = 1e9 + 7;
constexpr ll mod = 1e9 + 7;
constexpr ld eps = 1e-9;
const ld PI = acos(-1);

struct node {
    int mx;
    node *l{nullptr}, *r{nullptr};
};

node *build(int l, int r) {
    if (l + 1 == r) {
        return new node(0);
    }
    int m = (r + l) / 2;
    node *v = new node;
    v->l = build(l, m);
    v->r = build(m, r);
    v->mx = max(v->l->mx, v->r->mx);
    return v;
}

node *upd(node *v, int l, int r, int k, int x) {
    if (l + 1 == r) {
        return new node(x);
    }
    int m = (r + l) / 2;
    node *nd = new node(*v);
    if (k < m) nd->l = upd(v->l, l, m, k, x);
    else nd->r = upd(v->r, m, r, k, x);
    nd->mx = max(nd->l->mx, nd->r->mx);
    return nd;
}

int get(node *v, int l, int r, int lq, int rq) {
    if (l >= rq || lq >= r)return 0;
    if (l >= lq && r <= rq)return v->mx;
    int m = (r + l) / 2;
    return max(get(v->l, l, m, lq, rq), get(v->r, m, r, lq, rq));
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n;
    cin >> n;
    vector<int> all;
    vector<int> a(n);
    for (auto &i: a) {
        cin >> i;
        all.push_back(i - 1);
        all.push_back(i - 2);
        all.push_back(i);
        all.push_back(i + 1);
        all.push_back(i + 2);
    }
    all.push_back(-INF);
    all.push_back(INF);
    sort(all.begin(), all.end());
    all.resize(unique(all.begin(), all.end()) - all.begin());
    int K = all.size();
    for (auto &i: a) {
        i = lower_bound(all.begin(), all.end(), i) - all.begin();
    }
    vector<node *> t(n + 1);
    t[n] = build(0, K);
    for (int i = n - 1; ~i; --i) {
        int val = get(t[i + 1], 0, K, a[i] + 1, K);
        t[i] = upd(t[i + 1], 0, K, a[i], val + 1);
    }
    int res = 0;
    node *tree = build(0, K);
    pair<int, int> last = {0, 0};
    for (int i = 0; i < n; ++i) {
        int val = get(t[i + 1], 0, K, last.second + 2, K);
        res = max(res, last.first + 1 + val);
        int best = get(tree, 0, K, 0, a[i]);
        tree = upd(tree, 0, K, a[i], best + 1);
        last = {best + 1, a[i]};
    }
    cout << res;
    return 0;
}

提出情報

提出日時
問題 G - Suitable Edit for LIS
ユーザ ZergTricky
言語 C++ 20 (gcc 12.2)
得点 625
コード長 2302 Byte
結果 AC
実行時間 795 ms
メモリ 396020 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 625 / 625
結果
AC × 2
AC × 48
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_internal_00.txt, 01_internal_01.txt, 01_internal_02.txt, 01_internal_03.txt, 01_internal_04.txt, 01_internal_05.txt, 01_internal_06.txt, 01_internal_07.txt, 01_internal_08.txt, 01_internal_09.txt, 01_internal_10.txt, 01_internal_11.txt, 01_internal_12.txt, 01_internal_13.txt, 01_internal_14.txt, 01_internal_15.txt, 01_internal_16.txt, 01_internal_17.txt, 01_internal_18.txt, 01_internal_19.txt, 01_internal_20.txt, 01_internal_21.txt, 01_internal_22.txt, 01_internal_23.txt, 01_internal_24.txt, 01_internal_25.txt, 01_internal_26.txt, 01_internal_27.txt, 01_internal_28.txt, 01_internal_29.txt, 01_internal_30.txt, 01_internal_31.txt, 01_internal_32.txt, 01_internal_33.txt, 01_internal_34.txt, 01_internal_35.txt, 01_internal_36.txt, 01_internal_37.txt, 01_internal_38.txt, 01_internal_39.txt, 01_internal_40.txt, 01_internal_41.txt, 01_internal_42.txt, 01_internal_43.txt, 01_internal_44.txt, 01_internal_45.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3376 KiB
00_sample_01.txt AC 1 ms 3408 KiB
01_internal_00.txt AC 1 ms 3320 KiB
01_internal_01.txt AC 314 ms 245016 KiB
01_internal_02.txt AC 29 ms 27004 KiB
01_internal_03.txt AC 504 ms 396020 KiB
01_internal_04.txt AC 98 ms 71844 KiB
01_internal_05.txt AC 198 ms 125952 KiB
01_internal_06.txt AC 358 ms 176948 KiB
01_internal_07.txt AC 486 ms 250340 KiB
01_internal_08.txt AC 481 ms 249292 KiB
01_internal_09.txt AC 499 ms 229188 KiB
01_internal_10.txt AC 442 ms 202792 KiB
01_internal_11.txt AC 418 ms 195536 KiB
01_internal_12.txt AC 481 ms 219948 KiB
01_internal_13.txt AC 467 ms 213624 KiB
01_internal_14.txt AC 80 ms 71876 KiB
01_internal_15.txt AC 68 ms 59312 KiB
01_internal_16.txt AC 68 ms 59164 KiB
01_internal_17.txt AC 123 ms 114120 KiB
01_internal_18.txt AC 160 ms 146616 KiB
01_internal_19.txt AC 152 ms 139928 KiB
01_internal_20.txt AC 221 ms 189464 KiB
01_internal_21.txt AC 211 ms 183520 KiB
01_internal_22.txt AC 169 ms 153856 KiB
01_internal_23.txt AC 332 ms 248204 KiB
01_internal_24.txt AC 318 ms 239468 KiB
01_internal_25.txt AC 268 ms 214164 KiB
01_internal_26.txt AC 387 ms 286396 KiB
01_internal_27.txt AC 246 ms 202596 KiB
01_internal_28.txt AC 415 ms 306892 KiB
01_internal_29.txt AC 77 ms 59140 KiB
01_internal_30.txt AC 68 ms 59172 KiB
01_internal_31.txt AC 69 ms 59148 KiB
01_internal_32.txt AC 162 ms 105252 KiB
01_internal_33.txt AC 213 ms 132736 KiB
01_internal_34.txt AC 229 ms 142112 KiB
01_internal_35.txt AC 390 ms 185436 KiB
01_internal_36.txt AC 386 ms 185236 KiB
01_internal_37.txt AC 288 ms 159016 KiB
01_internal_38.txt AC 321 ms 166952 KiB
01_internal_39.txt AC 629 ms 250560 KiB
01_internal_40.txt AC 555 ms 232384 KiB
01_internal_41.txt AC 795 ms 315756 KiB
01_internal_42.txt AC 481 ms 212276 KiB
01_internal_43.txt AC 728 ms 284708 KiB
01_internal_44.txt AC 1 ms 3436 KiB
01_internal_45.txt AC 1 ms 3468 KiB