Cod sursa(job #2971012)

Utilizator YusyBossFares Yusuf YusyBoss Data 26 ianuarie 2023 11:49:47
Problema Stalpi Scor 20
Compilator cpp-64 Status done
Runda sa_fac_schema Marime 1.53 kb
#include <bits/stdc++.h>
#define NMAX 100000
#define int64 long long

using namespace std;

struct strstalp {
  int x, s, d, c;
  int lindex, rindex;
};

strstalp v[NMAX + 1];
int64 dp[NMAX + 1][2];

bool cmp(strstalp A, strstalp B) {
  return A.x < B.x;
}

int bs_left(int st, int dr, int poz) {
  int mij, sol;

  sol = dr;
  while (st <= dr) {
    mij = (st + dr ) / 2;
    if (v[mij].x >= poz) {
      sol = mij;
      dr = mij - 1;
    }
    else
      st = mij + 1;
  }

  return sol;
}

int bs_right(int st, int dr, int poz) {
  int mij, sol;

  sol = dr;
  while (st <= dr) {
    mij = (st + dr ) / 2;
    if (v[mij].x <= poz) {
      sol = mij;
      st = mij + 1;
    }
    else
      dr = mij - 1;
  }

  return sol;
}

signed main() {
  freopen("stalpi.in", "r", stdin);
  freopen("stalpi.out", "w", stdout);

  int n, i, j;
  cin >> n;

  for (i = 1; i <= n; i++) {
    cin >> v[i].x >> v[i].c >> v[i].s >> v[i].d;
  }

  sort(v + 1, v + n + 1, cmp);

  for (i = 1; i <= n; i++) {
    v[i].lindex = bs_left(1, i, v[i].x - v[i].s);
    v[i].rindex = bs_right(i, n, v[i].x + v[i].d);
  }

  for (i = 1; i <= n; i++) {
    dp[i][1] = dp[v[i].lindex - 1][0] + v[i].c;
    for (j = 1; j < i; j++) {
      if (v[j].rindex >= v[i].lindex - 1)
        dp[i][1] = min(dp[i][1], dp[j][1] + v[i].c);
    }

    dp[i][0] = dp[i][1];
    for (j = 1; j < i; j++) {
      if (v[j].rindex >= i)
        dp[i][0] = min(dp[i][0], dp[j][1]);
    }
  }

  cout << dp[n][0];
  return 0;
}