제출 #1343138

#제출 시각아이디문제언어결과실행 시간메모리
1343138alexandrosFeast (NOI19_feast)C++20
100 / 100
521 ms37964 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pll;

vector<ll> vec;
vector<vector<pair<ll, ll>>> memo;
ll amount, lambda;

pair<ll, ll> dp(ll i, bool open) // profit, segments
{
    if(i == amount-1) return open ? make_pair(vec[i] - lambda, 1ll) : make_pair(0ll, 0ll);
    if(memo[i][open].second != -1) return memo[i][open];
    pair<ll, ll> best = {LLONG_MIN, LLONG_MIN};
    if(!open) best = max(dp(i+1, 1), dp(i+1, 0));
    else best = max(pll{dp(i+1, 1).first + vec[i], dp(i+1, 1).second},
                    pll{dp(i+1, 0).first + vec[i] - lambda, dp(i+1, 0).second+1});
    return memo[i][open] = best;
}

int main() 
{
    ll seg, s = 0;
    scanf("%lld %lld", &amount, &seg);
    vec.resize(amount);
    for(ll i = 0; i < amount; i++) 
    {
        scanf("%lld", &vec[i]);
        s += max(vec[i], 0ll);
    }
    ll l = 0, r = s;
    while(l <= r)
    {
        lambda = (l + r) / 2;
        memo.assign(amount, vector<pll>(2, {-1, -1}));
        auto res = max(dp(0, 0), dp(0, 1));
        if(res.second > seg)
        {
            l = lambda+1;
        }
        else if(res.second < seg)
        {
            r = lambda-1;
        }
        else
        {
            l = lambda;
            r = lambda-1;
        }
    }
    lambda = l;
    memo.assign(amount, vector<pll>(2, {-1, -1}));
    auto res = max(dp(0, 0), dp(0, 1));
    // cout << res.first << " " << lambda << "\n";
    printf("%lld\n", res.first + res.second * lambda);
}

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

feast.cpp: In function 'int main()':
feast.cpp:26:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   26 |     scanf("%lld %lld", &amount, &seg);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
feast.cpp:30:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |         scanf("%lld", &vec[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...