Submission #1023505

#TimeUsernameProblemLanguageResultExecution timeMemory
1023505avighnaSolar Storm (NOI20_solarstorm)C++17
36 / 100
392 ms209592 KiB
#include <iostream>
#include <numeric>
#include <vector>

typedef long long ll;

const ll N = 1e6 + 1;

ll d[N], v[N], left[N], right[N], psum[N];
ll lift[N][20];

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);

  ll n, s, k;
  std::cin >> n >> s >> k;

  for (ll i = 0; i < n - 1; ++i) {
    std::cin >> d[i];
  }
  for (ll i = 0; i < n; ++i) {
    std::cin >> v[i];
  }

  for (ll i = n - 1, j = n - 1, dist = 0; i >= 0; --i) {
    if (i != n - 1) {
      dist += d[i];
    }
    // j is the last index satisfying dist[i...j] <= k
    while (dist > k and j - 1 >= 0) {
      dist -= d[j - 1];
      j--;
    }
    lift[i][0] = j + 1;
    right[i] = j;
  }
  for (ll i = 0, j = 0, dist = 0; i < n; ++i) {
    if (i != 0) {
      dist += d[i - 1];
    }
    while (dist > k and j < n - 1) {
      dist -= d[j];
      j++;
    }
    left[i] = j;
  }
  lift[n][0] = n;
  for (ll bt = 1; bt < 20; ++bt) {
    for (ll i = 0; i <= n; ++i) {
      lift[i][bt] = lift[lift[i][bt - 1]][bt - 1];
    }
  }

  auto binary_lift = [&](ll node, ll k) {
    for (ll bt = 0; bt < 20; ++bt) {
      if (k & (1 << bt)) {
        node = lift[node][bt];
      }
    }
    return node;
  };

  std::partial_sum(v, v + n, psum);
  auto sum = [&](ll l, ll r) {
    ll ans = psum[r];
    if (l - 1 >= 0) {
      ans -= psum[l - 1];
    }
    return ans;
  };

  std::pair<ll, ll> best;
  for (ll i = 0; i < n; ++i) {
    best = std::max(
        best, std::make_pair(sum(left[i], right[binary_lift(i, s - 1)]), i));
  }

  std::vector<ll> ans;
  for (ll i = 0, node = best.second; i < s; ++i, node = lift[node][0]) {
    ans.push_back(node);
  }
  while (!ans.empty() and ans.back() == n) {
    ans.pop_back();
  }
  std::cout << ans.size() << "\n";
  for (auto &i : ans) {
    std::cout << i + 1 << " ";
  }
  std::cout << "\n";
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...