제출 #652975

#제출 시각아이디문제언어결과실행 시간메모리
652975vladutpieleBigger segments (IZhO19_segments)C++17
37 / 100
1577 ms4124 KiB
#include <bits/stdc++.h>

#define int long long

using namespace std;

const int nmax = 500000;

int n;
int v[nmax + 5], sume[nmax + 5];

struct elem
{
    int maxSeg; /// in cate segmente impart prefixul [1 ... i]
    int minSum; /// suma minima pentru ultimul segment
    int maxPrv; /// cel mai mare capat dreapta al segmentului dp[i].maxSeg - 1
                ///daca capatul stanga al ultimului segment e j, maxPrv este j - 1
};

elem dp[nmax + 5];

signed main()
{
    cin >> n;
    for(int i = 1; i <= n; i ++)
    {
        cin >> v[i];
        sume[i] = sume[i - 1] + v[i];
    }
    /// initializare
    for(int i = 1; i <= n; i ++)
    {
        dp[i] = {1, sume[i], 1};
    }
    for(int i = 2; i <= n; i ++)
    {
        for(int j = 1; j < i; j ++)
        {
            if(dp[j].minSum <= sume[i] - sume[j])
            {
                if(dp[j].maxSeg + 1 > dp[i].maxSeg)
                {
                    dp[i].maxSeg = 1 + dp[j].maxSeg;
                    dp[i].minSum = sume[i] - sume[j];
                    dp[i].maxPrv = j;
                }
                else
                {
                    if(dp[j].maxSeg + 1 == dp[i].maxSeg)
                    {
                        if(sume[i] - sume[j] < dp[i].minSum)
                        {
                            dp[i].minSum = sume[i] - sume[j];
                            dp[i].maxPrv = j;
                        }
                    }
                }
            }
        }
    }
    cout << dp[n].maxSeg << '\n';
    return 0;
}
#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...