Submission #1286615

#TimeUsernameProblemLanguageResultExecution timeMemory
1286615mihai145Restore Array (RMI19_restore)C++20
7 / 100
886 ms936 KiB
#include <iostream>
#include <queue>
#include <vector>

int n, m;
std::vector<std::vector<std::pair<int, int>>> g;
std::vector<int> d;

void add_constraint(int a, int b, int k) {
  g[a].push_back({b, k});
  //  std::cout << "Add " << a << "---(" << k << ")--->" << b << '\n';
}

bool bellman_ford(int src) {
  std::vector<int> impr(n + 1, 0);
  std::vector<bool> inq(n + 1, false);
  d[src] = 0;
  inq[src] = true;

  std::queue<int> q;
  q.push(src);

  while (!q.empty()) {
    int u = q.front();
    q.pop();
    inq[u] = false;

    for (auto e : g[u]) {
      int v = e.first;
      int new_cost = d[u] + e.second;

      if (new_cost < d[v]) {
        d[v] = new_cost;
        if (inq[v]) {
          continue;
        }

        q.push(v);
        inq[v] = true;
        impr[v]++;

        if (impr[v] >= n) {
          return false;
        }
      }
    }
  }

  return true;
}

int main() {
  std::cin >> n >> m;

  g.resize(n + 1, std::vector<std::pair<int, int>>{});
  d.resize(n + 1, 1000000);

  for (int i = 1; i <= n; i++) {
    add_constraint(i - 1, i, 0);
    add_constraint(i, i - 1, 1);
  }

  for (int i = 0; i < m; i++) {
    int l, r, k, v;
    std::cin >> l >> r >> k >> v;
    ++l, ++r;

    // v = 0 -> >=k zeroes between l and r <=> <= r-l+1-k ones between l and r
    // v = 1 -> <k zeroes between l and r  <=> > r-l+1-k ones between l and r

    // v = 0 -> partsum(r) - partsum(l - 1) <= r-l+1-k
    // v = 1 -> partsum(r) - partsum(l - 1) > r-l+1-k <=> partsum(l - 1) -
    // partsum(r) < -r+l-1+k <=> partsum(l - 1) - partsum(r) <= -r+l-1+k-1

    if (v == 0) {
      add_constraint(r, l - 1, r - l + 1 - k);
    } else {
      add_constraint(l - 1, r, -r + l - 1 + k - 1);
    }
  }

  if (!bellman_ford(0)) {
    std::cout << -1 << '\n';
    return 0;
  }

  for (int i = 1; i <= n; i++) {
    std::cout << -(d[i] - d[i - 1]) << ' ';
  }
  std::cout << '\n';

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...