Cod sursa(job #2971022)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 26 ianuarie 2023 12:11:36
Problema Stalpi Scor 0
Compilator cpp-64 Status done
Runda sa_fac_schema Marime 2.17 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream cin ("stalpi.in");
ofstream cout ("stalpi.out");

#define NMAX 100005

int stalpi[NMAX];

struct INTERVAL{
  int x, y, cost;
};

INTERVAL intervals[NMAX];
INTERVAL new_intervals[NMAX];

bool cmp ( const INTERVAL& a, const INTERVAL& b ) {
  return a.cost < b.cost;
}

int main()
{
    int n, i;
    cin >> n;
    for ( i = 1; i <= n; i++ ) {
      cin >> stalpi[i];
      cin >> intervals[i].cost >> intervals[i].x >> intervals[i].y;
      intervals[i].x = max (0, stalpi[i] - intervals[i].x);
      intervals[i].y = stalpi[i] + intervals[i].y;
    }
    sort ( stalpi + 1, stalpi + n + 1 );
    int poz = 0;
    for ( i = 1; i <= n; i++ ) {
        int st, dr, mid, first_greater = -1, last_smaller = -1;
        st = 1;
        dr = n;
        while ( st <= dr ) {
          mid = ( st + dr ) / 2;
          if ( intervals[i].x <= stalpi[mid] ) {
            first_greater = mid;
            dr = mid - 1;
          }
          else {
            st = mid + 1;
          }
        }
        st = 1;
        dr = n;
        while( st <= dr ) {
          mid = ( st + dr ) / 2;
          if ( intervals[i].y >= stalpi[mid] ) {
            last_smaller = mid;
            st = mid + 1;
          }
          else {
            dr = mid - 1;
          }
        }
        if ( first_greater <= last_smaller && first_greater != -1 && last_smaller != -1 ) {
            new_intervals[poz].x = first_greater;
            new_intervals[poz].y = last_smaller;
            new_intervals[poz++].cost = intervals[i].cost;
        }
    }
    sort ( new_intervals, new_intervals + poz, cmp );
    int ans = new_intervals[0].cost;
    int st = new_intervals[0].x, dr = new_intervals[0].y;
    for ( i = 1; i < poz; i++ ) {
        if ( st > new_intervals[i].x || new_intervals[i].y > dr ) {
            ans += new_intervals[i].cost;
            st = min ( st, new_intervals[i].x );
            dr = max ( dr, new_intervals[i].y );
        }
        else if ( ans > new_intervals[i].cost ) {
            ans = new_intervals[i].cost;
        }
    }
    cout << ans;
    return 0;
}