답안 #6902

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
6902 2014-07-09T16:46:42 Z dohyun0324 수열 (APIO14_sequence) C++
0 / 100
0 ms 88988 KB
#include<stdio.h>
int n,k,top,p,path[210][100010],w,dap[100010];
long long int a[100010],s[100010],d[2][100010];
struct data
{
    long long int m,n,pos;
}st[100010];
int main()
{
    long long int i,j,r,m1,m2,n1,n2,m3,n3;
    scanf("%d %d",&n,&k);
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        s[i]=s[i-1]+a[i];
    }
    for(i=2;i<=k+1;i++)
    {
        top=1, p=1;
        st[1].m=s[1]; st[1].n=-s[1]*s[1]+d[i-1][1]; st[1].pos=1;
        for(j=2;j<=n;j++)
        {
            m2=s[j]; n2=-s[j]*s[j]+d[(i+1)%2][j];
            for(r=top;r>=1;r--)
            {
                if(r==1) break;
                m1=st[r].m; n1=st[r].n; m3=st[r-1].m; n3=st[r-1].n;
                if((n1-n2)*(m1-m3)>(m2-m1)*(n3-n1)) break;
                top--;
            }
            top++; st[top].m=m2; st[top].n=n2; st[top].pos=j;
            for(r=p;r<=top-1;r++)
            {
                m1=st[r+1].m; n1=st[r+1].n; m3=st[r].m; n3=st[r].n;
                if(n3-n1>(m1-m3)*s[j]) break;
            }
            p=r;
            d[i%2][j]=st[p].m*s[j]+st[p].n; path[i][j]=st[p].pos;
        }
    }
    printf("%lld\n",d[(k+1)%2][n]);
    p=n;
    for(i=k+1;i>=1;i--)
    {
        if(p==0) break;
        dap[++w]=p;
        p=path[i][p];
    }
    for(i=w;i>=2;i--) printf("%d ",dap[i]);
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 88988 KB Output is correct - contestant found the optimal answer: 108 == 108
2 Correct 0 ms 88988 KB Output is correct - contestant found the optimal answer: 999 == 999
3 Incorrect 0 ms 88988 KB Output isn't correct - Integer 2 violates the range [1, 1]
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Halted 0 ms 0 KB -