program sushi; (*ordino il vettore P in ordine crescente di tempo di fine; poi applico PROCEDURA RICERCALOWER*)
Uses Math;
const MAXN= 100002 ;
type piatto = record
inizio: int64;
durata: int64;
peso: int64;
fine: int64;
end ;
elenco = array [ 0 .. MAXN - 1 ] of int64;
table = array [ 0 .. MAXN - 1 ] of piatto;
var N, i, id: Longint ;
ricordafine : int64;
T : table;
S, W, D, E, DP, ricordaindice : elenco; (*array riferiti ai piatti Start, Weigth, Durata, End*)
Procedure scambia ( var a, b: int64) ;
var x: int64;
begin
x: = a;
a: = b;
b: = x;
end ;
Procedure ordinamento ( estremoi, estremos: int64; var v : elenco; var u: elenco; ordinato: boolean ) ;
var inf, sup, medio: int64;
pivot : int64;
begin
inf: = estremoi;
sup: = estremos;
medio: = ( estremoi+ estremos) div 2 ;
pivot: = v[ medio] ;
repeat
if ( ordinato) then
begin
while ( v[ inf] <pivot) do inf: = inf+ 1 ;
while ( v[ sup] >pivot) do sup: = sup- 1 ;
end ;
if inf<= sup then
begin
scambia( v[ inf] , v[ sup] ) ;
scambia( u[ inf] , u[ sup] ) ;
inf: = inf+ 1 ;
sup: = sup- 1 ;
end ;
until inf>sup;
if ( estremoi<sup) then ordinamento( estremoi, sup, v, u, ordinato) ;
if ( inf<estremos) then ordinamento( inf, estremos, v, u, ordinato) ;
end ;
Procedure ricercaLower ( var w: elenco; target: int64) ; (*ritorna indice del valore minore/uguale a target oppure -1 se non esiste*)
var m, start, eend: int64;
begin
start: = 0 ; eend: = N- 1 ; m: =- 1 ;
while start<= eend do
begin
m: = ( start + eend) div 2 ;
if w[ m] <= target then begin id: = m; start: = m+ 1 end
else if w[ m] >target then eend: = m- 1 ;
end ;
if eend=- 1 then id: =- 1 ;
end ;
begin
readln ( N) ;
for i: = 0 to N- 1 do begin ricordaindice[ i] : = i; DP[ i] : = 0 ; end ;
for i: = 0 to N- 1 do
begin
{ dish on table }
readln ( S[ i] , W[ i] , D[ i] ) ;
E[ i] : = S[ i] + D[ i] ;
T[ i] . inizio : = S[ i] ;
T[ i] . durata : = D[ i] ;
T[ i] . peso : = W[ i] ;
T[ i] . fine : = E[ i] ;
end ;
ordinamento( 0 , N- 1 , E, ricordaindice, true ) ;
for i: = 0 to N- 1 do (*faccio scorrere gli elementi dell'array P ordinato secondo la fine dei piatti, per ciascun piatto di P considero l'ora di inizio e cerco se c'è un piatto che finisce prima; se c'è, posso mangiare il piatto considerato se conveniente rispetto a quelli che ho mangiato fino a quel momento, altrimenti il piatto potrebbe essere il primo che arriva e allora lo prendo comunque, salvo poi controllare se ci sono altri piatti che iniziano dopo, ma finiscono contemporaneamente, e hanno il peso più conveniente*)
begin
ricordafine: = T[ ricordaindice[ i] ] . inizio ;
ricercaLower( E, ricordafine) ;
if id<>- 1 then
DP[ i] : = max ( DP[ i- 1 ] , DP[ id] + T[ ricordaindice[ i] ] . peso )
else
begin
if i= 0 then DP[ i] : = T[ ricordaindice[ i] ] . peso
else DP[ i] : = max ( DP[ i- 1 ] , T[ ricordaindice[ i] ] . peso )
end ;
end ;
writeln ( DP[ N- 1 ] ) ;
end .
cHJvZ3JhbSBzdXNoaTsgKCpvcmRpbm8gaWwgdmV0dG9yZSBQIGluIG9yZGluZSBjcmVzY2VudGUgZGkgdGVtcG8gZGkgZmluZTsgcG9pIGFwcGxpY28gUFJPQ0VEVVJBIFJJQ0VSQ0FMT1dFUiopClVzZXMgTWF0aDsKY29uc3QgTUFYTj0xMDAwMDI7CnR5cGUgcGlhdHRvID0gcmVjb3JkCiAgICAgICAgICAgICAgICAgICBpbml6aW86aW50NjQ7CiAgICAgICAgICAgICAgICAgICBkdXJhdGE6aW50NjQ7CiAgICAgICAgICAgICAgICAgICBwZXNvOmludDY0OwogICAgICAgICAgICAgICAgICAgZmluZTppbnQ2NDsKICAgICAgICAgICAgICAgIGVuZDsKICAgICBlbGVuY28gPSBhcnJheVswLi4gTUFYTi0xXSBvZiBpbnQ2NDsgICAgICAgICAgIAogICAgIHRhYmxlID0gYXJyYXlbMC4uTUFYTi0xXSBvZiBwaWF0dG87ICAgICAgICAgIAp2YXIgTixpLGlkOkxvbmdpbnQ7CiAgICByaWNvcmRhZmluZSA6IGludDY0OwogICAgVCA6IHRhYmxlOyAKICAgIFMsVyxELEUsIERQLCByaWNvcmRhaW5kaWNlIDplbGVuY287ICAoKmFycmF5IHJpZmVyaXRpIGFpIHBpYXR0aSBTdGFydCwgV2VpZ3RoLCBEdXJhdGEsIEVuZCopCiAgIAogICAgClByb2NlZHVyZSBzY2FtYmlhICh2YXIgYSxiOiBpbnQ2NCk7CnZhciB4OmludDY0OwpiZWdpbgogICB4Oj1hOwogICBhOj1iOwogICBiOj14OwplbmQ7ICAKClByb2NlZHVyZSBvcmRpbmFtZW50byAoZXN0cmVtb2ksZXN0cmVtb3M6IGludDY0OyB2YXIgdiA6IGVsZW5jbzsgdmFyIHU6ZWxlbmNvOyBvcmRpbmF0bzpib29sZWFuKTsKdmFyIGluZiwgc3VwLCBtZWRpbzppbnQ2NDsKICAgIHBpdm90IDppbnQ2NDsKYmVnaW4KICAgIGluZjo9ZXN0cmVtb2k7CiAgICBzdXA6PWVzdHJlbW9zOwogICAgbWVkaW86PSAoZXN0cmVtb2krZXN0cmVtb3MpIGRpdiAyOwogICAgcGl2b3Q6PXZbbWVkaW9dOwogICAgcmVwZWF0CiAgICAgIGlmIChvcmRpbmF0bykgdGhlbgogICAgICAgICBiZWdpbgogICAgICAgICAgICB3aGlsZSAodltpbmZdPHBpdm90KSBkbyAgaW5mOj1pbmYrMTsKICAgICAgICAgICAgd2hpbGUgKHZbc3VwXT5waXZvdCkgZG8gIHN1cDo9c3VwLTE7CiAgICAgICAgIGVuZDsKICAgICAgaWYgaW5mPD1zdXAgdGhlbgogICAgICAgYmVnaW4KICAgICAgICAgc2NhbWJpYSh2W2luZl0sdltzdXBdKTsKICAgICAgICAgc2NhbWJpYSh1W2luZl0sdVtzdXBdKTsKICAgICAgICAgaW5mOj1pbmYrMTsKICAgICAgICAgc3VwOj1zdXAtMTsKICAgICAgIGVuZDsKICAgIHVudGlsIGluZj5zdXA7CiAgICBpZiAoZXN0cmVtb2k8c3VwKSB0aGVuIG9yZGluYW1lbnRvKGVzdHJlbW9pLHN1cCx2LHUsb3JkaW5hdG8pOwogICAgaWYgKGluZjxlc3RyZW1vcykgdGhlbiBvcmRpbmFtZW50byhpbmYsZXN0cmVtb3Msdix1LG9yZGluYXRvKTsKZW5kOwpQcm9jZWR1cmUgcmljZXJjYUxvd2VyICh2YXIgdzplbGVuY287IHRhcmdldDppbnQ2NCk7ICgqcml0b3JuYSBpbmRpY2UgZGVsIHZhbG9yZSBtaW5vcmUvdWd1YWxlIGEgdGFyZ2V0IG9wcHVyZSAtMSBzZSBub24gZXNpc3RlKikKICB2YXIgbSxzdGFydCxlZW5kOiBpbnQ2NDsKICAgICAgCiBiZWdpbiAgCiAgIHN0YXJ0Oj0wOyBlZW5kOj1OLTEgOyBtOj0tMTsKICAgd2hpbGUgc3RhcnQ8PWVlbmQgZG8KICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICBtOj0oc3RhcnQgKyBlZW5kKSBkaXYgMjsKICAgICAgICAgICAgICAgICAgaWYgd1ttXTw9dGFyZ2V0IHRoZW4gYmVnaW4gaWQ6PW07ICBzdGFydDo9bSsxIGVuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgaWYgd1ttXT50YXJnZXQgdGhlbiAgIGVlbmQ6PW0tMTsgCiAgICAgICAgICAgZW5kOwogICBpZiBlZW5kPS0xIHRoZW4gaWQ6PS0xOwogZW5kOwoKYmVnaW4KICAgCiAgIHJlYWRsbihOKTsKICAgZm9yIGk6PTAgdG8gTi0xIGRvIGJlZ2luIHJpY29yZGFpbmRpY2VbaV06PWk7ICBEUFtpXTo9MDsgZW5kOwogICBmb3IgaTo9MCB0byBOLTEgZG8KICAgICAgYmVnaW4KICAgICAgICB7IGRpc2ggb24gdGFibGUgfQogICAgICAgICByZWFkbG4oU1tpXSxXW2ldLERbaV0pOwogICAgICAgICBFW2ldOj1TW2ldK0RbaV07CiAgICAgICAgIFRbaV0uaW5pemlvOj1TW2ldOwogICAgICAgICBUW2ldLmR1cmF0YTo9RFtpXTsKICAgICAgICAgVFtpXS5wZXNvOj1XW2ldOwogICAgICAgICBUW2ldLmZpbmU6PUVbaV07CiAgICAgIGVuZDsKICAgIG9yZGluYW1lbnRvKDAsTi0xLEUsIHJpY29yZGFpbmRpY2UsdHJ1ZSk7CiAgICBmb3IgaTo9MCB0byBOLTEgZG8gICgqZmFjY2lvIHNjb3JyZXJlIGdsaSBlbGVtZW50aSBkZWxsJ2FycmF5IFAgb3JkaW5hdG8gc2Vjb25kbyBsYSBmaW5lIGRlaSBwaWF0dGksIHBlciBjaWFzY3VuIHBpYXR0byBkaSBQIGNvbnNpZGVybyBsJ29yYSBkaSBpbml6aW8gZSBjZXJjbyBzZSBjJ8OoIHVuIHBpYXR0byBjaGUgZmluaXNjZSBwcmltYTsgc2UgYyfDqCwgIHBvc3NvIG1hbmdpYXJlIGlsIHBpYXR0byBjb25zaWRlcmF0byBzZSBjb252ZW5pZW50ZSByaXNwZXR0byBhIHF1ZWxsaSBjaGUgaG8gbWFuZ2lhdG8gZmlubyBhIHF1ZWwgbW9tZW50bywgYWx0cmltZW50aSBpbCBwaWF0dG8gcG90cmViYmUgZXNzZXJlIGlsIHByaW1vIGNoZSBhcnJpdmEgZSBhbGxvcmEgbG8gcHJlbmRvIGNvbXVucXVlLCBzYWx2byBwb2kgY29udHJvbGxhcmUgc2UgY2kgc29ubyBhbHRyaSBwaWF0dGkgY2hlIGluaXppYW5vIGRvcG8sIG1hIGZpbmlzY29ubyBjb250ZW1wb3JhbmVhbWVudGUsIGUgaGFubm8gaWwgcGVzbyBwacO5IGNvbnZlbmllbnRlKikKICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgcmljb3JkYWZpbmU6PVRbcmljb3JkYWluZGljZVtpXV0uaW5pemlvOwogICAgICAgICAgICAgICAgICAgIHJpY2VyY2FMb3dlcihFLCByaWNvcmRhZmluZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgaWQ8Pi0xIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUFtpXTo9bWF4IChEUFtpLTFdLERQW2lkXStUW3JpY29yZGFpbmRpY2VbaV1dLnBlc28pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpPTAgdGhlbiBEUFtpXTo9VFtyaWNvcmRhaW5kaWNlW2ldXS5wZXNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBEUFtpXTo9bWF4IChEUFtpLTFdLFRbcmljb3JkYWluZGljZVtpXV0ucGVzbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ7ICAgICAgICAgCiAgICAgICAgICAgICAgICBlbmQ7CiAgIHdyaXRlbG4oRFBbTi0xXSk7ICAgCmVuZC4=