Cod sursa(job #2971044)

Utilizator YusyBossFares Yusuf YusyBoss Data 26 ianuarie 2023 12:45:21
Problema Stalpi Scor 10
Compilator cpp-64 Status done
Runda sa_fac_schema Marime 1.58 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];

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

bool cmp1(strstalp A, strstalp B) {
  return A.rindex < B.rindex;
}

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);
    dp[i] = LLONG_MAX;
  }

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

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

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