Submission #542276

#TimeUsernameProblemLanguageResultExecution timeMemory
542276DeepessonSplit the sequence (APIO14_sequence)C++17
60 / 100
2083 ms109176 KiB
#include <bits/stdc++.h>
#define MAX 105000
typedef long long ftype;
typedef std::pair<ftype,ftype> point;

ftype f(point a,  ftype x) {
    return a.first*x + a.second;
}
const long long val = 1LL<<30LL;
const int maxn = 4e5;
const int membros = 25 * maxn;
point mem[membros];
int lefta[membros],righta[membros];
int cur=3;
int alocar(void){
    int x=cur;
    if(x==20*maxn)assert(0);
    cur++;
    mem[x]={0,-1LL<<62LL};
    lefta[x]=righta[x]=0;
    return x;
}
int inicio = alocar();
void clear(void){
    cur=3;
    inicio=alocar();
}
void add_line(point nw, int v = inicio, long long l = -val, long long r = val) {
    long long m = (l + r) / 2LL;
    bool lef = f(nw, l) > f(mem[v], l);
    bool mid = f(nw, m) > f(mem[v], m);
    if(mid) {
        std::swap(mem[v], nw);
    }
    if(r-l==1) {
        return;
    } else if(lef != mid) {
        if(!lefta[v])lefta[v]=alocar();
        add_line(nw, lefta[v], l, m);
    } else {
        if(!righta[v])righta[v]=alocar();
        add_line(nw,righta[v], m, r);
    }
}
typedef std::pair<long long,point> plpoi;
plpoi get(int x, int v = inicio, long long l = -val, long long r = val) {
    if(!v)return {-(1LL<<62LL),{-1,-1}};
    long long m = (l + r) / 2LL;
    if(r-l==1) {
        return {f(mem[v], x),mem[v]};
    } else if(x < m) {
        return std::max({f(mem[v], x),mem[v]}, get(x, lefta[v], l, m));
    } else {
        return std::max({f(mem[v], x),mem[v]}, get(x, righta[v], m, r));
    }
}
long long array[MAX];
long long pref[MAX];
point prevans[MAX];
int backtracking[MAX][205];
int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    for(auto&x:prevans)x={0,-1LL<<62LL};
    int N,K;
    std::cin>>N>>K;
    for(int i=0;i!=N;++i){
        std::cin>>array[i];
        if(i){
            pref[i]=pref[i-1];
        }
        pref[i]+=array[i];
    }
    pref[N]=1LL<<50LL;
    long long resp=0;
    for(int i=0;i!=K+1;++i){
        clear();
        add_line({0,0});
        std::map<point,int> mapa;
        for(int j=0;j!=N;++j){
            if(j!=N-1){
            add_line(prevans[j]);
            mapa[prevans[j]]=j;}
            long long tot = pref[j];
            long long ans = 0;
            if(j){
                auto a=get(pref[j]);
                ans=a.first;
                backtracking[j][i]=mapa[a.second];
            }
            resp=ans;
            prevans[j]={tot,-(pref[j]*tot)+ans};
        }
    }
    std::vector<int> bck;
    int cur=N-1;
    for(int i=K;i!=0;--i){
        int t = backtracking[cur][i];
        bck.push_back(t+1);
        cur=t;
    }
    std::reverse(bck.begin(),bck.end());
    std::cout<<resp<<"\n";
    for(int i=0;i!=bck.size()-1;++i)std::cout<<bck[i]<<" ";
    std::cout<<bck.back()<<"\n";
}

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:106:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |     for(int i=0;i!=bck.size()-1;++i)std::cout<<bck[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...