제출 #46335

#제출 시각아이디문제언어결과실행 시간메모리
46335RayaBurong25_1Split the sequence (APIO14_sequence)C11
71 / 100
2071 ms86268 KiB
#include <stdio.h>
#define INF 1e18
long long Sum[100005];
long long SumSq[100005];
long long DP[100005][2];
int Last[100005][205];
typedef struct line line;
struct line
{
    long long c;
    double s;
    int i;
};
line Lines[100005];
int L;
int cnt = 0;
int I, J;
double intersect(long long m, long long c, long long m2, long long c2)
{
    // cnt++;
    if (m == m2)
    {
        if (c2 >= c)
            return -INF;
        else
            return INF;
    }
    else
        return (double) (c2 - c)/(m - m2);
}
int V[205];
int main()
{
    int N, K;
    scanf("%d %d", &N, &K);
    int n, k, i;
    for (i = 0; i < N; i++)
    {
        scanf("%lld", &Sum[i]);
        if (i > 0)
            Sum[i] += Sum[i - 1];
        SumSq[i] = Sum[i]*Sum[i];
    }
    long long r, c;
    double s;
    for (k = 1; k <= K; k++)
    {
        L = 1;
        J = 0;
        Lines[0].c = 0;
        Lines[0].s = -INF;
        Lines[0].i = -1;
        // Lines[0] = {0, -INF, -1};
        for (n = 0; n < N; n++)
        {
            while (J + 1 < L && Lines[J + 1].s <= Sum[n])
            {
                J++;
                // cnt++;
            }
            DP[n][k%2] = Sum[Lines[J].i]*Sum[n] + Lines[J].c;
            Last[n][k] = Lines[J].i;

            c = DP[n][(k - 1)%2] - SumSq[n];
            while (L > 0 && (s = intersect(Sum[Lines[L - 1].i], Lines[L - 1].c, Sum[n], c)) <= Lines[L - 1].s)
            {
                L--;
                // cnt++;
            }
            if (s != INF)
            {
                Lines[L].c = c;
                Lines[L].s = s;
                Lines[L].i = n;
                // Lines[L] = {c, s, n};
                L++;
            }
        }
        // printf("k%d\n", k);
    }
    printf("%lld\n", DP[N - 1][K%2]);
    i = Last[N - 1][K];
    k = K - 1;
    while (k >= 0 && i != -1)
    {
        V[k] = i + 1;
        i = Last[i][k];
        k--;
    }
    for (i = 0; i < K; i++)
        printf("%d ", V[i]);
    // std::cout << "cnt" << cnt;
}

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

sequence.c: In function 'main':
sequence.c:44:15: warning: unused variable 'r' [-Wunused-variable]
     long long r, c;
               ^
sequence.c:35:5: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &N, &K);
     ^~~~~~~~~~~~~~~~~~~~~~
sequence.c:39:9: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld", &Sum[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...