답안 #635746

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
635746 2022-08-26T18:21:57 Z martin_nedev Peru (RMI20_peru) C++14
0 / 100
2 ms 680 KB
#include "peru.h"

#include <bits/stdc++.h>
using namespace std;

#ifdef __LOCALTEST
    #include "grader.cpp"
#endif // __LOCALTEST

//first subtask
const int MAXLOG = 15;
const int MAXN = 2050;
const int64_t inf = 1e17;
const int64_t mod = 1e9+7;

struct RangeMaximumQuery
{
    int n;
    int log[MAXN+10];
    int sparseTable[MAXLOG][MAXN+10];

    RangeMaximumQuery(int n)
    {
        //precompute log array
        //!log[i] gives the value of log2(i) rounded down

        this->n = n;

        log[1] = 0;
        for (int i = 2; i <= n; i++)
            log[i] = log[i>>1] + 1;


    }

    void Build(int *arr)
    {
        //construct sparse table

        for (int i = 0; i < n; i++)
            sparseTable[0][i] = arr[i];

        for (int lg = 1; lg <= MAXLOG; lg++)
        {
            for (int i = 0; i < n; i++)
            {
                int jump = (1<<(lg-1));

                if (i+jump >= n)
                    sparseTable[lg][i] = sparseTable[lg-1][i];

                else
                    sparseTable[lg][i] = max(sparseTable[lg-1][i], sparseTable[lg-1][i+jump]);
            }
        }
    }

    int Query(int leftQ, int rightQ)
    {
        //answering query
        return max(sparseTable[log[rightQ-leftQ+1]][leftQ],
                   sparseTable[log[rightQ-leftQ+1]][rightQ-(1<<log[rightQ-leftQ+1])+1]);
    }

};

int evaluateAnswer(const int n, int64_t *arr)
{
    int64_t ans = 0;
    for (int i = 0; i < n; i++)
    {
        ans = (ans*23 + arr[i])%mod;
    }

    return ans;
}

int64_t dp1[MAXN+10][MAXN+10];
int64_t dp2[MAXN+10];
int solve(int n, int k, int* v)
{
    RangeMaximumQuery *rmq = new RangeMaximumQuery(n);
    rmq->Build(v);

    for (int i = 0; i < n; i++)
        dp2[i] = inf;

    dp1[0][1] = v[0];
    dp2[0] = v[0];


    for (int i = 1; i < n; i++)
    {
        for (int j = 1; j <= min(i+1, k); j++)
        {
            dp1[i][j] = (int64_t(rmq->Query((i+1)-j, i)) + dp2[(i+1)-j])%mod;
            dp2[i] = min(dp2[i], dp1[i][j])%mod;
        }

    }

    //cout << evaluateAnswer(n, dp2) << endl;

    int ans = evaluateAnswer(n, dp2);
    return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2 ms 680 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2 ms 680 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2 ms 680 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -