Submission #33807

#TimeUsernameProblemLanguageResultExecution timeMemory
33807ztrongSplit the sequence (APIO14_sequence)C++14
49 / 100
2000 ms87732 KiB
#include <bits/stdc++.h>
using namespace std;

#define llint long long
#define fi first
#define se second

void openFile() {
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL);
#ifdef Tr___
    freopen("test.inp", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
}

const int maxN = 1e5 + 5;
const int maxM = 2e2 + 5;
const llint INF = 1e9 + 7;

int N, K;
llint a[maxN];
llint f[maxN][2];
int t[maxN][maxM];
vector<llint> A, B;
vector<int> id;
int pointer;
//y = A * x + B;

inline void enter() {
    scanf("%d %d", &N, &K);
    for (int i = 1; i <= N; ++i) {
        scanf("%lld", &a[i]);
        a[i] += a[i - 1];
    }
}

void clear() {
    A.resize(0);
    B.resize(0);
    id.resize(0);
    pointer = 0;
}

bool bad(int l1, int l2, int l3) {
    return (B[l3] - B[l1]) * (A[l1] - A[l2]) 
        <= (B[l2] - B[l1]) * (A[l1] - A[l3]);
}

void add(llint a, llint b, int i) {
    A.push_back(a);
    B.push_back(b);
    id.push_back(i);

    while (A.size() >= 3 && bad(A.size()-3, A.size() - 2, A.size() - 1)) {
        A.erase(A.end() - 2);
        B.erase(B.end() - 2);
        id.erase(id.end() - 2);
    }
}

pair<llint, int> query(llint x) {
    if (pointer >= A.size())
        pointer = A.size() - 1;

    while (pointer < A.size() - 1 &&
            A[pointer] * x + B[pointer] 
            < A[pointer + 1] * x + B[pointer + 1]) 
        pointer++;
    
    return {A[pointer] * x + B[pointer], id[pointer]};
}

inline void solve() {
    for (int k = 1; k <= K; ++k) {
        clear();
        add(0, 0, 0);
        for (int i = k; i <= N; ++i) {
            pair<llint, int> best = query(a[i]);
            f[i][k&1] = best.fi;
            t[i][k] = best.se;

            add(a[i], f[i][!(k&1)] - a[i] * a[i], i);
        }
    }

    printf("%lld\n", f[N][K&1]);
    int trace = t[N][K];
    while (trace) {
        printf("%d ", trace);
        trace = t[trace][--K];
    }
}

int main() {
    openFile();
    enter();
    solve();
    return 0;
}

Compilation message (stderr)

sequence.cpp: In function 'std::pair<long long int, int> query(long long int)':
sequence.cpp:63:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (pointer >= A.size())
                 ^
sequence.cpp:66:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while (pointer < A.size() - 1 &&
                    ^
sequence.cpp: In function 'void enter()':
sequence.cpp:31:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &N, &K);
                           ^
sequence.cpp:33:29: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld", &a[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...