Cod sursa(job #2971031)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 26 ianuarie 2023 12:30:59
Problema Stalpi Scor 60
Compilator cpp-64 Status done
Runda sa_fac_schema Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin  ("stalpi.in");
ofstream fout ("stalpi.out");

const int INF = 2e9;
const int MAX_N = 100000;
int n, l, m, r, save;
struct stalp{
    int st, dr, cost, x;

    inline bool operator < (const stalp &rhs) const{
        return x < rhs.x;
    }
} v[MAX_N + 5];

inline bool cmp(const stalp &s1, const stalp &s2){
    return s1.st < s2.st;
}

long long dp[MAX_N + 5];

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

    fin>>n;
    for(int i=1; i<=n; i++){
        fin>>v[i].x>>v[i].cost>>v[i].st>>v[i].dr;
        v[i].st = v[i].x - v[i].st;
        v[i].dr = v[i].x + v[i].dr;
    }
    sort(v+1, v+n+1);

    //for(int i=1; i<=n; i++)
    //    cout<<v[i].st<<" "<<v[i].x<<" "<<v[i].dr<<"\n";

    for(int i=1; i<=n; i++){
        l = 1;
        save = r = i;
        while(l <= r){
            m = ((l + r) >> 1);
            if(v[i].st <= v[m].x){
                save = m;
                r = m - 1;
            }else
                l = m + 1;
        }
        v[i].st = save;

        save = l = i;
        r = n;
        while(l <= r){
            m = ((l + r) >> 1);
            if(v[m].x <= v[i].dr){
                save = m;
                l = m + 1;
            }else
                r = m - 1;
        }
        v[i].dr = save;
    }
    sort(v+1, v+n+1, cmp);

    //cout<<"\n";
    //for(int i=1; i<=n; i++)
    //    cout<<v[i].cost<<":  "<<v[i].st<<"->"<<v[i].dr<<"\n";

    for(int i=1; i<=n; i++)
        dp[i] = INF;

    dp[0] = 0;
    for(int i=1; i<=n; i++)
        for(int j=v[i].st; j<=v[i].dr; j++)
            dp[j] = min(dp[j], dp[v[i].st-1] + v[i].cost);

    //cout<<"\n";
    //for(int i=1; i<=n; i++)
    //    cout<<dp[i]<<" ";

    fout<<dp[n];
    return 0;
}
/**
3 10
3 5
1 3
2 3
**/