제출 #1238189

#제출 시각아이디문제언어결과실행 시간메모리
1238189Timosh모임들 (IOI18_meetings)C++20
17 / 100
72 ms9800 KiB
#include "bits/stdc++.h"
#include "meetings.h"

using namespace std;

struct node
{
  int pref, suff, mx, sz;
};

node merge(node a, node b)
{
  node c;
  c.pref = a.pref;
  c.suff = b.suff;
  if (a.pref == a.sz)
    c.pref = a.sz + b.pref;
  if (b.suff == b.sz)
    c.suff = a.suff + b.sz;
  c.sz = a.sz + b.sz;
  c.mx = max({a.mx, b.mx, a.suff + b.pref});
  return c;
}

vector<node> t(4e5);

void upd(int pos, int l, int r, int i)
{
  if (l == r)
    t[i].pref = t[i].suff = t[i].mx = 1;
  else
  {
    int m = (l + r) / 2;
    if (pos <= m)
      upd(pos, l, m, i * 2);
    else
      upd(pos, m + 1, r, i * 2 + 1);
    t[i] = merge(t[i * 2], t[i * 2 + 1]);
  }
}

node get(int l, int r, int tl, int tr, int i = 1)
{
  if (l > tr || tl > r)
    return t[0];
  if (l <= tl && tr <= r)
    return t[i];
  int m = (tl + tr) / 2;
  return merge(get(l, r, tl, m, i * 2), get(l, r, m + 1, tr, i * 2 + 1));
}

std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R)
{
  for (auto &i : t)
    i.sz = 1;
  int q = L.size();
  int n = H.size();
  vector<long long> ans(q, 1e18);
  for (int i = 0; i < n; i++)
    if (H[i] == 1)
      upd(i, 0, n - 1, 1);
  for (int i = 0; i < q; i++)
    ans[i] = 2 * (R[i] - L[i] + 1) - get(L[i], R[i], 0, n - 1).mx;
  return ans;
}
#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...