제출 #1342788

#제출 시각아이디문제언어결과실행 시간메모리
1342788fgggRastuci (COCI25_rastuci)C++20
15 / 110
2 ms836 KiB
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
using ll = int;
using vl = __int128_t;
using ld = long double;
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
struct st {
    vector<pair<ll, ll>> t;
    st(ll n) {
        t.assign(4 * n, {(ll)-1e18, (ll)-1});
    }
    void upd(ll v, ll l, ll r, ll i, ll x) {
        if (l + 1 == r) {
            t[v] = {x, l};
            return;
        }
        ll md = (l + r) / 2;
        if (i < md) upd(2 * v + 1, l, md, i, x);
        else upd(2 * v + 2, md, r, i, x);
        t[v] = max(t[2 * v + 1], t[2 * v + 2]);
    }
    pair<ll, ll> get(ll v, ll l, ll r, ll ql, ll qr) {
        if (l >= qr || ql >= r) return {(ll)-1e18, (ll)-1};
        if (l >= ql && r <= qr) return t[v];
        ll md = (l + r) / 2;
        return max(get(2 * v + 1, l, md, ql, qr), get(2 * v + 2, md, r, ql, qr));
    }
};
void solve() {
    ll n;
    cin >> n;
    vector<ll> a(n), pr = {0};
    for (ll& x : a) cin >> x, pr.push_back(pr.back() + x);
    vector<vector<ll>> dp(n, vector<ll>(n, -1e18)), p(n, vector<ll>(n));
    vector<st> dst(n, st(n));
    for (ll i = 0; i < n; i++) {
        for (ll j = i; j > 0; j--) {
            ll nd = pr[j] - pr[i + 1] + pr[j];
            ll k = lower_bound(all(pr), nd) - pr.begin();
            if (k > j - 1) continue;
            auto [mx, opt] = dst[j - 1].get(0, 0, n, k, j);
            dp[i][j] = mx + 1;
            p[i][j] = opt;
            dst[i].upd(0, 0, n, j, dp[i][j]);
        }
        dp[i][0] = 1;
        p[i][0] = -1;
        dst[i].upd(0, 0, n, 0, 1);
    }
    cout << *max_element(all(dp[n - 1])) << '\n';
    vector<ll> res;
    ll i = n - 1, j = max_element(all(dp[n - 1])) - dp[n - 1].begin();
    while (j != -1) {
        res.push_back(pr[i + 1] - pr[j]);
        ll wi = i;
        i = j - 1;
        j = p[wi][j];
    }
    reverse(all(res));
    for (ll x : res) cout << x << ' ';
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    ll t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'void solve()':
Main.cpp:36:44: warning: overflow in conversion from 'double' to 'std::vector<int>::value_type' {aka 'int'} changes value from '-1.0e+18' to '-2147483648' [-Woverflow]
   36 |     vector<vector<ll>> dp(n, vector<ll>(n, -1e18)), p(n, vector<ll>(n));
      |                                            ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...