제출 #1061770

#제출 시각아이디문제언어결과실행 시간메모리
1061770MilosMilutinovicPeru (RMI20_peru)C++14
100 / 100
378 ms74292 KiB
#include "peru.h"
#include <bits/stdc++.h>

using namespace std;

const int md = 1e9 + 7;

int add(int x, int y) {
  return x + y < md ? x + y : x + y - md;
}

int mul(int x, int y) {
  return x * 1LL * y % md;
}

int solve(int n, int k, int* v) {
  vector<int> ft(n);
  deque<int> dq;
  for (int i = 0; i < n; i++) {
    while (!dq.empty() && v[i] >= v[dq.back()]) {
      dq.pop_back();
    }
    while (!dq.empty() && i - dq.front() + 1 > k) {
      dq.pop_front();
    }
    dq.push_back(i);
    ft[i] = v[dq.front()];
  }
  const long long inf = (long long) 1e18;
  vector<long long> dp(n, inf);
  multiset<pair<long long, int>> st;
  vector<array<int, 3>> stk;
  for (int i = 0; i < n; i++) {
    int border = i;
    while (!stk.empty() && v[i] > stk.back()[0]) {
      border = stk.back()[1];
      st.erase({(border == 0 ? 0LL : dp[border - 1]) + stk.back()[0], border});
      stk.pop_back();
    }
    stk.push_back({v[i], border, i});
    st.emplace((border == 0 ? 0LL : dp[border - 1]) + v[i], border);
    while (!st.empty() && i - st.begin()->second + 1 > k) {
      st.erase(st.begin());
    }
    if (!st.empty()) {
      dp[i] = min(dp[i], st.begin()->first);
    }
    int j = max(0, i - k + 1);
    dp[i] = min(dp[i], (j == 0 ? 0LL : dp[j - 1]) + ft[i]);
  }
  int res = 0;
  int pw = 1;
  for (int i = n - 1; i >= 0; i--) {
    dp[i] %= md;
    res = add(res, mul(pw, dp[i]));
    pw = mul(pw, 23);
  }
  return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...