제출 #337216

#제출 시각아이디문제언어결과실행 시간메모리
337216bigDuck수열 (APIO14_sequence)C++14
100 / 100
1361 ms93184 KiB
#include<bits/stdc++.h>
using namespace std;
#define INIT  ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
#define pii pair<int, int>
#define count_bits __builtin_popcount
#define int ll

int t, n, m, k, a[100010], q, l, r;
int p[100010];
int dp[100010][2];
int dp1[1010][210];

int32_t dir[100010][210];



bool upper(pair<pair<int, int>, pii> l1, pair<pair<int,int>, pii> l2){
    return ( (l1.sc.ft*(l2.ft.ft)+l1.sc.sc)>(l2.sc.ft*(l2.ft.ft)+l2.sc.sc)  );
}


int intersect(pair<pair<int, int>, pii> l1, pair<pair<int, int>, pii> l2){
    int a1=l1.sc.ft, b1=l1.sc.sc, a2=l2.sc.ft, b2=l2.sc.sc;
    if( ((b2-b1)%(a1-a2))==0 ){
        return ( ((b2-b1)/(a1-a2))  );
    }
    else{
        return ( ((b2-b1)/(a1-a2))+1  );
    }
}


void convex_hull(int g){

vector<pair<pair<int, int>, pii> > st;
for(int j=n; j>=((g==1)?(0):(1)); j--){
        pair<pair<int,int >, pii> ac={ {0ll, j}, {-p[j], dp[j][0]}};
    while( (!st.empty()) && ((upper(ac, st.back())) ) ){
        st.pop_back();
    }
    if(st.empty()){
        st.pb(ac);
    }
    else{
            if(ac.sc.ft==st.back().sc.ft){ac.ft.ft=st.back().ft.ft; st.pb(ac);}
            else{
        st.pb({{intersect(ac, st.back()), j}, ac.sc});}
    }
}

int j=0;
for(int i=n; i>=1; i--){
    while((j<(st.size()-1) ) && ( ( ((st[j+1].ft.ft<=(p[n]-p[i])) && (st[j].ft.ft<(p[n]-p[i])) ) || (st[j].ft.sc==i) )) ){
        j++;
    }

    dp[i][1]=(p[n]-p[i])*st[j].sc.ft+st[j].sc.sc+p[i]*(p[n]-p[i]);
    dir[i][g]=st[j].ft.sc;
}



for(int i=1; i<=n ;i++){
    dp[i][0]=dp[i][1];
}

}










int32_t main(){
INIT







cin>>n>>k;

if(n<=1000){
for(int i=1; i<=n ;i++){
    cin>>a[i];
    p[i]=p[i-1]+a[i];
}

dp1[0][0]=0;
for(int g=1; g<=(k+1); g++){
    dp1[0][g]=-1;
}
k++;
vector<int> v;
for(int i=1; i<=n; i++){
    for(int g=0; g<=k; g++){
        dp1[i][g]=-1;
    }
    for(int j=i-1; j>=0; j--){
        for(int g=0; g<k; g++){
            if(dp1[j][g]==-1){continue;}
            if(dp1[i][g+1]==(-1)){
                dp1[i][g+1]=dp1[j][g]+(p[i]-p[j])*(p[i]-p[j]);
                dir[i][g+1]=j;
            }
            else{
                    if(  (dp1[j][g]+(p[i]-p[j])*(p[i]-p[j]))<dp1[i][g+1] ){
                        dir[i][g+1]=j;
                    }
                dp1[i][g+1]=min(dp1[i][g+1], dp1[j][g]+(p[i]-p[j])*(p[i]-p[j]));
            }
        }
    }
}

cout<<( ((p[n]*p[n])-dp1[n][k])/2 );
cout<<"\n";
int cnt=1, cr=n;
while(cnt<k){
    v.pb(dir[cr][k-cnt+1]);
    cr=dir[cr][k-cnt+1];
    cnt++;
}
for(int i=k-1-1; i>=0; i--){
    cout<<v[i]<<" ";
}
return 0;
}






for(int i=1; i<=n; i++){
    cin>>a[i];
    p[i]=(p[i-1]+a[i]);
}


for(int g=1; g<=(k+1); g++){
    convex_hull(g);
}

cout<<(dp[n][0] )<<"\n"<<flush;
int cnt=0, cr=n;
while(cnt<k){
    cout<<dir[cr][k-cnt+1]<<" "; cr=dir[cr][k-cnt+1]; cnt++;
}


return 0;
}



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

sequence.cpp: In function 'void convex_hull(long long int)':
sequence.cpp:58:13: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<std::pair<long long int, long long int>, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |     while((j<(st.size()-1) ) && ( ( ((st[j+1].ft.ft<=(p[n]-p[i])) && (st[j].ft.ft<(p[n]-p[i])) ) || (st[j].ft.sc==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...