Submission #1239311

#TimeUsernameProblemLanguageResultExecution timeMemory
1239311madamadam3Nile (IOI24_nile)C++20
0 / 100
173 ms20000 KiB
#include "nile.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;

#define sz(x) int((x).size())
#define bg(x) (x).begin()
#define en(x) (x).end()
#define all(x) bg(x), en(x)
#define FOR(i, a, b) for (int i = a; i < b; i++)
#define srt(x) sort(all(x))
#define rev(x) reverse(all(x))
#define pb push_back
#define lb lower_bound
#define ub upper_bound

const ll INF = 1e18;

struct Node {
  ll best; int idx;

  Node() : best(INF), idx(-1) {};
  Node(ll v, int i) : best(v), idx(i) {};
  Node(Node left, Node right) {
    best = min(left.best, right.best);
    if (left.best < right.best) idx = left.idx;
    else idx = right.idx;
  }
};

struct RMQ {
  int n; vl arr; vector<Node> st;

  RMQ() {};
  RMQ(int N, vl Arr) {
    n = N; arr = Arr;

    st.resize(4*n);
    build(0, 0, n);
  }

  Node build(int i, int l, int r) {
    if (l + 1 == r) return st[i] = Node(arr[l], l);

    int m = l + (r - l) / 2;
    return st[i] = Node(build(2*i+1, l, m), build(2*i+2, m, r));
  }

  Node query(int i, int l, int r, int ql, int qr) {
    if (r <= ql || qr <= l) return Node();
    if (ql <= l && r <= qr) return st[i];

    int m = l + (r - l) / 2;
    return Node(query(2*i+1, l, m, ql, qr), query(2*i+2, m, r, ql, qr));
  }

  Node update(int i, int l, int r, int k, ll v) {
    if (!(l <= k && k < r)) return st[i];
    if (l + 1 == r) return st[i] = Node(v, k);

    int m = l + (r - l) / 2;
    return st[i] = Node(update(2*i+1, l, m, k, v), update(2*i+2, m, r, k, v));
  }

  Node query(int l, int r) {
    return query(0, 0, n, l, r);
  }

  void update(int k, ll v) {
    update(0, 0, n, k, v);
  }
};

vl calculate_costs(vi W, vi A, vi B, vi E) {
  int n = sz(W), q = sz(E);
  vl w(all(W)), a(all(A)), b(all(B)), e(all(E));

  auto rmq = RMQ(n, b);

  vl R(q, 0);
  FOR(qn, 0, q) {
    rmq = RMQ(n, b);

    FOR(i, 0, n) {
      if (rmq.query(i, i+1).best == INF) continue;
      auto best = rmq.query(i+1, i+E[qn]+1);
      if (best.best == INF) {
        R[qn] += a[i];
        // cout << i << " had to go alone\n";
      } else {
        R[qn] += b[i] + best.best;
        rmq.update(best.idx, INF);
        rmq.update(i, INF);
        // cout << "best for " << i << " is " << best.idx << " with cost " << b[i] + best.best << "\n";
      }
    }
  }
  return R;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...