Cod sursa(job #2522536)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 12 ianuarie 2020 17:34:53
Problema Stalpi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>
using namespace std;

const int DIM = 1e5 + 5;

struct Pillar {
	int ps, cs, le, ri;
} plr[DIM];

int pos[DIM];
long long sgt[DIM << 2];

void build(int nd, int le, int ri) {
	if (le == ri) {
		if (le != 0)
			sgt[nd] = (1LL << 60);
	} else {
		int md = (le + ri) >> 1;
		build(nd << 1, le, md);
		build(nd << 1 | 1, md + 1, ri);
		sgt[nd] = min(sgt[nd << 1], sgt[nd << 1 | 1]);
	}
}

void update(int nd, int le, int ri, int ps, long long vl) {
	if (le == ri)
		sgt[nd] = min(sgt[nd], vl);
	else {
		int md = (le + ri) >> 1;
		if (ps <= md)
			update(nd << 1, le, md, ps, vl);
		else
			update(nd << 1 | 1, md + 1, ri, ps, vl);
		sgt[nd] = min(sgt[nd << 1], sgt[nd << 1 | 1]);
	}
}

long long query(int nd, int le, int ri, int st, int en) {
	if (st <= le and ri <= en)
		return sgt[nd];
	else {
		int md = (le + ri) >> 1;
		if (en <= md)
			return query(nd << 1, le, md, st, en);
		else if (md < st)
			return query(nd << 1 | 1, md + 1, ri, st, en);
		else
			return min(query(nd << 1, le, md, st, en),
								 query(nd << 1 | 1, md + 1, ri, st, en));
	}
}

int main(void) {
	freopen("stalpi.in", "r", stdin);
	freopen("stalpi.out", "w", stdout);
	int n; scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d %d %d %d", &plr[i].ps, &plr[i].cs, &plr[i].le, &plr[i].ri);
		pos[i] = plr[i].ps;
	}
	sort(pos + 1, pos + n + 1);
	sort(plr + 1, plr + n + 1,
	[](const Pillar &p1, const Pillar &p2) {
		return p1.ps + p1.ri < p2.ps + p2.ri;
	});
	build(1, 0, n);
	for (int i = 1; i <= n; ++i) {
		int psl;
		for (int le = 1, ri = n; le <= ri; ) {
			int md = (le + ri) >> 1;
			if (pos[md] >= plr[i].ps - plr[i].le)
				psl = md, ri = md - 1;
			else
				le = md + 1;
		}
		int psr;
		for (int le = 1, ri = n; le <= ri; ) {
			int md = (le + ri) >> 1;
			if (pos[md] <= plr[i].ps + plr[i].ri)
				psr = md, le = md + 1;
			else
				ri = md - 1;
		}
		long long cs = query(1, 0, n, psl - 1, n);
		update(1, 0, n, psr, cs + plr[i].cs);
	}
	printf("%lld\n", query(1, 0, n, n, n));
	return 0;
}