Submission #635764

#TimeUsernameProblemLanguageResultExecution timeMemory
635764martin_nedevPeru (RMI20_peru)C++14
18 / 100
1092 ms39500 KiB
#include "peru.h" #include <bits/stdc++.h> using namespace std; #ifdef __LOCALTEST #include "grader.cpp" #endif // __LOCALTEST //first subtask const int MAXLOG = 20; const int MAXN = 400000; const int64_t inf = 1e17; const int64_t mod = 1e9+7; struct RangeMaximumQuery { int n; int log[MAXN+10]; int sparseTable[MAXLOG+2][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 dp[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++) dp[i] = inf; dp[0] = v[0]; for (int i = 1; i < n; i++) { int down = max(0, i-k+1); for (int j = i; j >= down; j--) { /*if (j == 0) dp[i] = max(dp[i], int64_t(rmq->Query(j, i)));*/ //else dp[i] = min(dp[i], dp[j-1]+int64_t(rmq->Query(j, i))); } //cout << dp[i] << endl; } //cout << evaluateAnswer(n, dp) << endl; int ans = evaluateAnswer(n, dp); return ans; } /* 8 3 3 2 9 8 7 11 3 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...