Submission #762560

#TimeUsernameProblemLanguageResultExecution timeMemory
762560Ahmed57수열 (APIO14_sequence)C++17
100 / 100
1334 ms84172 KiB
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
deque<pair<pair<long long,long long>,long long>> v1;
double in(long double m1,long double c1,long double m2,long double c2){
    if(m1==m2)return (c1>=c2);
    return (c2-c1)/(m1-m2);
}
void insert_line(long long m,long long c,long long idx){
    while(v1.size()>1&&in(v1[v1.size()-2].first.first,v1[v1.size()-2].first.second,v1[v1.size()-1].first.first,v1[v1.size()-1].first.second)>=in(v1[v1.size()-2].first.first,v1[v1.size()-2].first.second,m,c)){
        v1.pop_back();
    }
    v1.push_back({{m,c},idx});
}
pair<long long,long long> eval(long long x){
    while(v1.size()>1&&in(v1[0].first.first,v1[0].first.second,v1[1].first.first,v1[1].first.second)<x)v1.pop_front();
    return {v1[0].first.first*x+v1[0].first.second,v1[0].second};
}
long long dp[100001][2];
int lol[100001][204];
signed main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    long long n,k;
    cin>>n>>k;
    long long arr[n+1] = {0};
    for(int i = 1;i<=n;i++){
        cin>>arr[i];
        arr[i]+=arr[i-1];
    }
    if(n==1){
        cout<<0<<endl;
        return 0;
    }
    for(long long j = 1;j<=k+1;j++){
        v1.clear();
        insert_line(arr[j-1],(dp[j-1][!(j&1)]-arr[j-1]*arr[n]),j-1);
        for(int i = j;i<=n;i++){
            dp[i][j&1] = arr[i]*arr[n]-arr[i]*arr[i]+eval(arr[i]).first;
            lol[i][j] = eval(arr[i]).second;
            insert_line(arr[i],(dp[i][!(j&1)]-arr[i]*arr[n]),i);
        }
    }
    k++;
    cout<<dp[n][k&1]<<endl;
    int x = n;
    vector<long long> ha;
    while(k>1){
        ha.push_back(max(1,lol[x][k]));
        x = lol[x][k];k--;
    }
    for(int i = ha.size()-1;i>=0;i--){
        cout<<ha[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...