Pagini recente » Cod sursa (job #2920053) | Cod sursa (job #2948535) | Cod sursa (job #2057908) | Cod sursa (job #2476164) | Cod sursa (job #2971031)
#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
**/