Submission #1131462

#TimeUsernameProblemLanguageResultExecution timeMemory
1131462TraianDanciuRestore Array (RMI19_restore)C++20
100 / 100
37 ms584 KiB
// sp[i] = cate 0-uri sunt de la 1 la i. Din restrictiile alea deducem
// cate o conditie

// 0. Daca value=0, inseamna ca sunt cel putin k 0-uri pe intervalul
// ala deci sp[r+1] >= sp[l]+k
// 1. Daca value=1, inseamna ca sunt cel mult k-1 0-uri pe intervalul
// la deci sp[l] >= sp[r+1]-(k-1)

// Si voi face un graf orientat, in care o muchie de la i la j de cost
// c va reprezenta faptul ca sp[i] >= sp[j]+c

// Voi face un brut in care voi calcula valoarea maxiima a lui sp[i],
// ma voi opri atunci cand nu se va mai modifica nimic
            
#include <stdio.h>

const int MAXN = 5'000;
const int MAXM = 10'000;

int n, m, sp[MAXN + 1];

struct Edge {
  int u, v, w;
} edges[MAXM + 2 * MAXN];

void readGraph() {
  int i, l, r, k, value;
  scanf("%d%d", &n, &m);
  for(i = 0; i < m; i++) {
    scanf("%d%d%d%d", &l, &r, &k, &value);
    if(value == 0) {
      edges[i] = {r + 1, l, k};
    } else {
      edges[i] = {l, r + 1, -(k - 1)};
    }
  }
  for(i = 0; i < n; i++) {
    edges[m + 2 * i] = {i, i + 1, -1};
    edges[m + 2 * i + 1] = {i + 1, i, 0};
  }
}

void computeAnswer() {
  int gata, i;
  gata = 0;
  while(!gata) {
    gata = 1;
    for(i = 0; i < m + 2 * n; i++) {
      if(sp[edges[i].u] < sp[edges[i].v] + edges[i].w) {
        gata = 0;
        sp[edges[i].u] = sp[edges[i].v] + edges[i].w;
      }
    }
    for(i = 0; i <= n; i++) {
      if(sp[i] > i) {
        gata = 1;
      }
    }
  }
}

void writeAnswer() {
  int i, ok = 1;
  for(i = 1; i <= n; i++) {
    if(sp[i] > i) {
      ok = 0;
    }
  }
  if(ok) {
    for(i = 1; i <= n; i++) {
      printf("%d ", sp[i] == sp[i - 1]);
    }
    fputc('\n', stdout);
  } else {
    printf("-1\n");
  }
}

int main() {
  readGraph();
  computeAnswer();
  writeAnswer();
  return 0;
}

Compilation message (stderr)

restore.cpp: In function 'void readGraph()':
restore.cpp:28:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   28 |   scanf("%d%d", &n, &m);
      |   ~~~~~^~~~~~~~~~~~~~~~
restore.cpp:30:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |     scanf("%d%d%d%d", &l, &r, &k, &value);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...