Submission #1222840

#TimeUsernameProblemLanguageResultExecution timeMemory
1222840madamadam3Meetings (IOI18_meetings)C++20
0 / 100
409 ms851968 KiB
#include "meetings.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll INF = 1e18;

vector<ll> minimum_costs(vector<int> H, vector<int> L, vector<int> R) {
  int Q = L.size();
  int n = H.size();
  vector<ll> C(Q);

  vector<int> queries(Q); iota(queries.begin(), queries.end(), 0); 
  sort(queries.begin(), queries.end(), [&](int a, int b) {return R[a] < R[b];}); 

  vector<vector<ll>> left_stacks(n), right_stacks(n);
  vector<ll> stL(n, 0), stR(n, 0);
  int cur_query = 0;
  for (int i = 0; i < n; i++) {
    int cur_idx = i - 1;
    while (cur_idx >= 0 && stL[cur_idx] < H[i]) {
      stL[cur_idx] = H[i];
      cur_idx--;
    }

    stL[i] = H[i];
    left_stacks[i] = stL;
  }

  for (int i = n-1; i >= 0; i--) {
    int cur_idx = i+1;
    while (cur_idx < n && stR[cur_idx] < H[i]) {
      stR[cur_idx] = H[i];
      cur_idx++;
    }

    stR[i] = H[i];
    right_stacks[i] = stR;
  }

  for (int st = 0; st < n; st++) {
    for (int i = 1; i < n; i++) {
      left_stacks[st][i] += left_stacks[st][i-1];
    }
    for (int i = n - 2; i >= 0; i--) {
      right_stacks[st][i] += right_stacks[st][i+1];
    }
  }

  auto f = [&](int i, int j) {
    ll lv = left_stacks[i][i], rv = right_stacks[i][i+1];
    ll lsub = L[j] == 0 ? 0 : left_stacks[i][L[j] - 1], rsub = R[j] == n - 1 ? 0 : right_stacks[i][R[j] + 1];

    lv -= lsub; rv -= rsub;
    return lv + rv;
  };

  for (int j = 0; j < Q; ++j) {
    C[j] = INF;
      for (int dr = 0; dr <= 1; dr++) {
        C[j] = min({C[j], f(clamp(L[j] + dr, 0, n-1), j), f(clamp(R[j] - dr, 0, n-1), j)});
      }

    // for (int i = L[j]; i <= R[j]; i++) {
    //   C[j] = min(C[j], f(i, j));
    // }
  }

  return C;
}
#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...