Submission #722039

#TimeUsernameProblemLanguageResultExecution timeMemory
722039BobonbushSplit the sequence (APIO14_sequence)C++17
100 / 100
1374 ms81012 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MODULO = 12;
template<class X , class Y>
    bool Maximize(X &x  , Y y)
    {
        if(x < y)
        {
            x = y;
            return true;
        }
        return false;
    }
template<class X ,class Y>
    bool Minimize(X &x , Y y)
    {
        if(x > y)
        {
            x = y;
            return true;
        }
        return false;
    }
template<class X ,class Y>
    void Add(X &x ,  Y y)
    {
        x += y;
        if(x >= MODULO) x-= MODULO;
    }
template<class X ,class Y>
    void Sub(X & x , Y y)
    {
        x -= y;
        if(x < 0 ) x += MODULO;
    }
const int N = 1e5+1;
long long dp[2][N];
long long a[N];
int P[201][N];
long long cost(int l ,int r)
{
    assert(l <= r);
    return (a[r] - a[l-1]) * (a[r] - a[l-1]);
}

void conq(int l ,int r ,int opt_l , int opt_r , bool cur , int k)
{
    if(l > r)return ;
    int mid = (l+r) >> 1;

    dp[cur][mid] = (1ll << 61);
    int opt;
    for(int i = opt_l ; i <=min(mid -1 , opt_r) ; i++)
    {
        long long sta = dp[!cur][i] + cost(i +1 , mid);
        if(Minimize(dp[cur][mid] , sta))
        {
            opt = i;
        }
    }  
    P[k][mid] = opt;
    conq(l , mid-1 , opt_l , opt , cur ,  k);
    conq(mid+1 , r , opt , opt_r , cur , k );
} 
vector<int>List;

void trace(int k , int i)
{
    if(k == 0)
    {
        return ;
    }

    trace(k-1  , P[k][i] );
    cout << P[k][i] << ' ';
 
}
int n ;
int  k;


void Input()
{
    cin >> n >> k;
    for(int i = 1; i <= n ; i++)
    {
        cin >> a[i];
        a[i] += a[i-1];
    }
}
void Process()
{
    bool cur = false;
    for(int i = 1 ; i <= n ; i++)
    {    
        dp[cur][i] = cost(1 , i);
    }
    for(int g = 1 ; g <= k ; g++)
    {
        cur ^= 1;
        conq(g +1 , n , g , n , cur , g );
    }

    cout << (cost(1 , n ) - dp[cur][n]) /2LL <<'\n';
    

    trace(k , n);
}

int main()
{
    ios_base :: sync_with_stdio(0);cin.tie(0);
    int test = 1;
    while(test--)
    {
        Input();
        Process();
        cout <<'\n';
    }
    return 0;
}

Compilation message (stderr)

sequence.cpp: In function 'void conq(int, int, int, int, bool, int)':
sequence.cpp:64:9: warning: 'opt' may be used uninitialized in this function [-Wmaybe-uninitialized]
   64 |     conq(mid+1 , r , opt , opt_r , cur , k );
      |     ~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...