Submission #1030039

#TimeUsernameProblemLanguageResultExecution timeMemory
1030039TraianDanciuColouring a rectangle (eJOI19_colouring)C++17
60 / 100
199 ms67588 KiB
#include <stdio.h>
#include <vector>

static inline long long min(long long a, long long b) {
  return a < b ? a : b;
}
static inline long long max(long long a, long long b) {
  return a > b ? a : b;
}

#define MAXN 200000
#define INFINIT 1000000000000000000

int a[MAXN * 2];
struct Restrictie {
  int st, dr, val;
} v[MAXN * 2];

int cost[MAXN], st[MAXN], p[MAXN];
std::vector<int> dr[MAXN];

struct SegmentTree {
  long long aint[4 * MAXN], lazy[4 * MAXN], qval;
  int n, qleft, qright;

  void init(int n) {
    int i;
    
    this->n = n;
    for(i = 0; i < 4 * n; i++) {
      aint[i] = lazy[i] = 0;
    }
  }

  void propagate(int node, int left, int right) {
    aint[node] += lazy[node];
    if(left < right) {
      lazy[2 * node + 1] += lazy[node];
      lazy[2 * node + 2] += lazy[node];
    }
    lazy[node] = 0;
  }

  void _update(int node, int left, int right) {
    int middle;

    propagate(node, left, right);
    if(qleft <= left && right <= qright) {
      lazy[node] += qval;
      propagate(node, left, right);
    } else {
      middle = (left + right) / 2;
      propagate(2 * node + 1, left, middle);
      propagate(2 * node + 2, middle + 1, right);
      if(qleft <= middle) {
        _update(2 * node + 1, left, middle);
      }
      if(middle < qright) {
        _update(2 * node + 2, middle + 1, right);
      }
      aint[node] = min(aint[2 * node + 1], aint[2 * node + 2]);
    }
  }
  void update(int qleft, int qright, long long qval) {
    this->qleft = qleft;
    this->qright = qright;
    this->qval = qval;
    _update(0, 0, n - 1);
  }

  long long _query(int node, int left, int right) {
    int middle;
    long long ans;

    propagate(node, left, right);
    if(qleft <= left && right <= qright) {
      return aint[node];
    }

    middle = (left + right) / 2;
    ans = INFINIT;
    if(qleft <= middle) {
      ans = min(ans, _query(2 * node + 1, left, middle));
    }
    if(middle < qright) {
      ans = min(ans, _query(2 * node + 2, middle + 1, right));
    }

    return ans;
  }
  long long query(int qleft, int qright) {
    this->qleft = qleft;
    this->qright = qright;
    return _query(0, 0, n - 1);
  }
} aint;

int main() {
  int n, m, i, j, l, c, j1, j2, nnou;
  long long ans;

  scanf("%d%d", &n, &m);
  for(i = 0; i < n + m - 1; i++) {
    scanf("%d", &a[i]);
  }
  for(i = 0; i < n + m - 1; i++) {
    scanf("%d", &v[i].val);

    c = min(i, m - 1);
    l = i - c;
    v[i].st = l - c + m - 1;
    
    c = max(0, i - n + 1);
    l = i - c;
    v[i].dr = l - c + m - 1;
  }

  ans = 0;
  for(j1 = 0; j1 < 2; j1++) {
    j2 = v[j1].st % 2;

    nnou = 0;
    for(i = j1; i < n + m - 1; i += 2) {
      cost[nnou++] = a[i];
    }
    for(i = j2; i < n + m - 1; i += 2) {
      st[i / 2] = v[i].st / 2;
      dr[v[i].dr / 2].push_back(i / 2);
      p[i / 2] = v[i].val;
    }

    aint.init(nnou + 1);
    for(i = 0; i < nnou; i++) {
      aint.update(i + 1, i + 1, aint.query(0, i));
      aint.update(0, i, cost[i]);
      for(j = 0; j < (int)dr[i].size(); j++) {
        aint.update(st[dr[i][j]] + 1, i + 1, p[dr[i][j]]);
      }
    }
    ans += aint.query(0, nnou);

    for(i = 0; i < nnou; i++) {
      dr[i].clear();
    } 
  }

  printf("%lld\n", ans);
  return 0;
}

Compilation message (stderr)

colouring.cpp: In function 'int main()':
colouring.cpp:102:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  102 |   scanf("%d%d", &n, &m);
      |   ~~~~~^~~~~~~~~~~~~~~~
colouring.cpp:104:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  104 |     scanf("%d", &a[i]);
      |     ~~~~~^~~~~~~~~~~~~
colouring.cpp:107:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |     scanf("%d", &v[i].val);
      |     ~~~~~^~~~~~~~~~~~~~~~~
#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...