제출 #363772

#제출 시각아이디문제언어결과실행 시간메모리
363772BartolM수열 (APIO14_sequence)C++17
62 / 100
734 ms83932 KiB
#include <bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <int, pii> pip;
typedef pair <pii, int> ppi;
typedef pair <ll, ll> pll;
typedef pair <ll, int> pli;

const int INF=0x3f3f3f3f;
const ll MAX=(ll)INF*INF;
const int N=1e5+5;
const int K=202;

int n, k;
ll dp[2][N];
int bac[N][K];
ll pref[N];

int ind, koji[N];
vector <pll> v;

int ccw(pll a, pll b, pll c) {
    ll ret=a.X*(b.Y-c.Y)+b.X*(c.Y-a.Y)+c.X*(a.Y-b.Y);
    if (ret>0) return 1;
    if (ret<0) return -1;
    return 0;
}

ll f(pll pp, ll x) {
    return pp.X*x+pp.Y;
}

void dodaj(pll pp, int br) {
    while (v.size()>1 && ccw(v[(int)v.size()-2], v.back(), pp)>0) v.pop_back();
    koji[v.size()]=br;
    v.pb(pp);
}

pli query(ll x) {
    ind=min(ind, (int)v.size()-1);
    while (ind+1<(int)v.size() && f(v[ind], x)<=f(v[ind+1], x)) ++ind;
    return mp(f(v[ind], x), koji[ind]);
}

void solve() {
    int b=1;
    for (int j=1; j<=k; ++j) {
        v.clear();
        ind=0;
        for (int i=1; i<=j; ++i) dodaj(mp(pref[i], dp[!b][i]-pref[i]*pref[i]), i);
        for (int i=j+1; i<=n; ++i) {
            pli curr=query(pref[i]);
            bac[i][j]=curr.Y;
            dp[b][i]=curr.X;
            dodaj(mp(pref[i], dp[!b][i]-pref[i]*pref[i]), i);
        }
        b^=1;
    }
    printf("%lld\n", dp[!b][n]);
    pii pp=mp(n, k);
    while (pp.Y) {
        pp.X=bac[pp.X][pp.Y--];
        printf("%d ", pp.X);
    }
}

void load() {
    scanf("%d %d", &n, &k);
    for (int i=1; i<=n; ++i) {
        scanf("%lld", &pref[i]);
        pref[i]+=pref[i-1];
    }
}

int main() {
    load();
    solve();
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

sequence.cpp: In function 'void load()':
sequence.cpp:75:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   75 |     scanf("%d %d", &n, &k);
      |     ~~~~~^~~~~~~~~~~~~~~~~
sequence.cpp:77:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   77 |         scanf("%lld", &pref[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...